Tooltip Data Binding в Silverlight. Версия для печати 11/08/08

Как вы знаете в MS WPF, ну и соответственно в Silverlight невероятно просто отделить данные приложения от их представления. Достаточно написать что-то вроде:

<ListBox  x:Name="Cities" ItemsSource="{Binding Items}" />

и дело в шляпе. DataContext автоматически пробрасывается по Logic Tree. Но к сожалению эта стратегия не срабатывает при попытке прибиндить данные к ToolTip. Например, казалось бы такой логичный код:

<HyperlinkButton
   Content="{Binding Name}"
   Tag="{Binding Id}"
   ToolTipService.ToolTip="{Binding PopupInfo}" 
/>

работать не будет. Все дело в том что, всплывающая подсказка ToolTipService.ToolTip находится за пределами Logic Tree и ей ни какого Data Context не передается!

Решить проблему можно с помощью Attached Properties! Это мощнейшая технология напоминает аспектно-ориентированное программирование и открывает просто невероятные возможность по расширению функционала существующих объектов без наследования или агрегирования последних.

Реализуем простое attached property, который будет подключать data context к объекту - всплывающей подсказке:

public class Helpers {

  public static string GetToolTipContent(DependencyObject obj) {
    return (string)obj.GetValue(ToolTipContentProperty);
  }

  public static void SetToolTipContent(DependencyObject obj,
                                        string value) {
     obj.SetValue(ToolTipContentProperty, value);
  }

  public static readonly DependencyProperty
  ToolTipContentProperty =
    DependencyProperty.RegisterAttached(
      "ToolTipContent",
      typeof(string),
      typeof(Helpers),
      new PropertyMetadata(OnToolTipContentChangedCallback));

  private static void OnToolTipContentChangedCallback(
     DependencyObject d, DependencyPropertyChangedEventArgs e) {
    var tt = (ContentControl)ToolTipService.GetToolTip(d);
    tt.Content = e.NewValue.ToString();
    ToolTipService.SetToolTip(d, tt);
  }
}

А в XAML соответсвенно его будем использовать:

xmlns:service="clr-namespace:Service"
...
<HyperlinkButton
   Content="{Binding Name}"
   Tag="{Binding Id}"
   service:Helpers.ToolTipContent="{Binding PopupInfo}"
>
   <ToolTipService.ToolTip>
      <ToolTip Style="{StaticResource NewToolTip}" />
   </ToolTipService.ToolTip>
</HyperlinkButton>

вот и вся уличная магия! Мысль о применении attached property пришла после прочтения этой заметки Nikhil Kothari. Классное имя Нехилл :)

| Оставить комментарий

Комментарии

Оставить комментарий
Подписаться на комментарии


Последние статьи

Opml.xml

Rss

About

MeМеня зовут Денис Ларионов.
Работаю программистом. Мне есть что рассказать про: web-бизнес, маркетинг, программирование.

RSS

Я - Слушаю подкаст Radio-T