元素绑定Silverlight 3

时间:2010-03-09 10:09:52

标签: silverlight silverlight-3.0 binding

我尝试在Silverlight 3中使用Element Binding到ToolTipService.ToolTip中的ComboBox的SelectedItem。 此代码有效:

<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中项目的属性。 在第一个代码中,Name在组合的工具提示中正确显示,但在第二个代码中,工具提示为“ - ”。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

啊......用工具提示很有趣。

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);
        }
    }
}

答案 1 :(得分:1)

一种非常简单的方法可以是在源对象中定义一个附加属性

每当用户将鼠标悬停在控件上时,连接的字符串将显示为一个简单的简单工具提示。

像这样:

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>