Привязка элементов Silverlight 3 - PullRequest
2 голосов
/ 09 марта 2010

Я пытался использовать привязку элементов в Silverlight 3 к SelectedItem ComboBox в ToolTipService.ToolTip. Этот код работает:

<ComboBox x:Name="cboSource" DisplayMemberPath="Name" ToolTipService.ToolTip="{Binding ElementName=cboSource, Path=SelectedItem.Name}" Width="180" />

но этот код не:

<ComboBox x:Name="cboSource" DisplayMemberPath="Name" Width="180" >
    <ToolTipService.ToolTip>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding ElementName=cboSource, Path=SelectedItem.Code}" Margin="0,0,5,0"/>
            <TextBlock Text="-" Margin="0,0,5,0"/>
            <TextBlock Text="{Binding ElementName=cboSource, Path=SelectedItem.Name}"/>
        </StackPanel>
    </ToolTipService.ToolTip>
</ComboBox>

Имя и код являются свойствами элемента в cboSource.ItemsSource. В первом коде имя корректно отображается во всплывающей подсказке со списком, но во второй подсказке кода это «-». Есть идеи?

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Очень простым способом может быть определение дополнительного свойства в исходном объекте что-то

всякий раз, когда пользователь наводит указатель мыши на элемент управления, объединенная строка отображается в виде простой простой подсказки.

как это:

using System...
....


public Class Employee
{
  public string Forenames {get;set;}
  public string Surname {get;set;}
  public string Address {get;set;}
  private string tooltip;
  public string Tooltip 
  {
   get{return tooltip;}
   set
   {
    value=Forenames + " " + Surname + "," Address ;
   }
}
//... other methods to follow
}


XAML MyPage.cs code has following 

public partial Class MyPage : Page
{
Public List<Employee> Employees{get;set;}
public MyPage()
{
 InitiazeComponents();
 Employees = new List<Employee>(); // initialise
 Employees=GetEmployees();
}

public List<Employee> GetEmployees(){
.. 
 Write code that ..returns
..
}
.. other code to follow..
}

Теперь в MyPage.xaml

...

<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="8,4,0,0" Name="cboCostCentreInvestor" ItemsSource="{Binding Employees}" ToolTipService.ToolTip="{Binding ElementName=cboCostCentreInvestor,Path=SelectedItem.Tooltip}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Style="{StaticResource stackPanelComboboxItemStyle}">
                                    <TextBlock Text="{Binding Forenames}" Style="{StaticResource textBlockComboboxItem}" />
                                    <TextBlock Text="{Binding Surname}" Style="{StaticResource textBlockComboboxItem}" />                                
                                </StackPanel>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>


                </ComboBox>
1 голос
/ 10 марта 2010

Ааа ... весело с подсказками.

ToolTipService на самом деле "укоренен" в основании дерева (если у вас есть Mole, вы можете проверить это дважды) - следовательно, он не получает свой DataContext, распространяемый вниз от родительских элементов.

В прошлом я делал хакерские вещи, чтобы исправить это поведение, но все они сводятся к «Кодированию присоединенного свойства, которое принимает DataContext и передает его вместе с присоединенным элементом».

Желаю удачи - эта штука меня ужалила пару раз. :)

О, нашла для вас ссылку: http://www.codeproject.com/Articles/36078/Silverlight-2-0-How-to-use-a-DataBinding-with-the-ToolTipService.aspx

РЕДАКТИРОВАТЬ: Попробуйте это:

        <ComboBox x:Name="cboSource" DisplayMemberPath="Name" Width="180">
        <local:DataBindingTooltip.TooltipDataContext>
            <Binding ElementName="cboSource"/>
        </local:DataBindingTooltip.TooltipDataContext>
        <local:DataBindingTooltip.Tooltip>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=SelectedItem.Code}" Margin="0,0,5,0"/>
                    <TextBlock Text="-" Margin="0,0,5,0"/>
                    <TextBlock Text="{Binding Path=SelectedItem.Name}"/>
                </StackPanel>
        </local:DataBindingTooltip.Tooltip>
    </ComboBox>

со следующим классом:

    public class DataBindingTooltip
{
    public static readonly DependencyProperty TooltipDataContextProperty =
        DependencyProperty.RegisterAttached(
            "TooltipDataContext",
            typeof (object),
            typeof (DataBindingTooltip),
            null);

    public static readonly DependencyProperty TooltipProperty = 
        DependencyProperty.RegisterAttached(
            "Tooltip", 
            typeof(object), 
            typeof(DataBindingTooltip), 
            new PropertyMetadata(TooltipChanged));

    public static void SetTooltip(DependencyObject d, object value)
    {
        d.SetValue(TooltipProperty, value);
    }
    public static object GetTooltip(DependencyObject d)
    {
        return d.GetValue(TooltipProperty);
    }

    public static void SetTooltipDataContext(DependencyObject d, object value)
    {
        d.SetValue(TooltipDataContextProperty, value);
    }
    public static object GetTooltipDataContext(DependencyObject d)
    {
        return d.GetValue(TooltipDataContextProperty);
    }

    private static void TooltipChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        if (sender is FrameworkElement)
        {
            var element = sender as FrameworkElement;
            element.Loaded += ElementLoaded;
        }

    }

    static void ElementLoaded(object sender, RoutedEventArgs e)
    {
        if (sender is FrameworkElement)
        {
            var element = sender as FrameworkElement;
            element.Loaded -= ElementLoaded;

            var tooltip = element.GetValue(TooltipProperty) as DependencyObject;
            if (tooltip != null)
            {
                if (GetTooltipDataContext(element) != null)
                {
                    tooltip.SetValue(FrameworkElement.DataContextProperty,
                                     element.GetValue(TooltipDataContextProperty));
                }
                else
                {
                    tooltip.SetValue(FrameworkElement.DataContextProperty,
                                     element.GetValue(FrameworkElement.DataContextProperty));
                }
            }
            ToolTipService.SetToolTip(element, tooltip);
        }
    }
}
...