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. Классное имя Нехилл :)