WPF绑定到从DataTemplate获取的属性

时间:2016-01-29 02:45:35

标签: .net wpf xaml data-binding datatemplate

我想将一个对象的属性绑定到其子对象之一的类似属性,而这个子内容(包括所讨论的属性的值)是从DataTemplate获得的。这一切都发生在UserControl,如果重要的话。

<UserControl.Resources>
  <DataTemplate x:Key="RText">
    <TextBlock Text="TextR" ToolTip="TextR"/>
  </DataTemplate>
</UserControl.Resources>

<StackPanel x:Name="LayoutRoot" ToolTip="{Binding Path=ToolTip, ElementName=TemplText, FallbackValue='error'}">
  <TextBlock Text="Some common static text " />
  <ContentControl x:Name="TemplText" ContentTemplate="{StaticResource RText}" />
</StackPanel>

此外,在代码隐藏中,在此控件的构造函数中,有一个赋值

LayoutRoot.DataContext = this

显然需要绑定到UserControl自己的属性(这不会​​显示在代码段中)。我想无论如何这个问题都没关系,但我确实需要这一行。

这个想法是这样的:整个StackPanelLayoutRoot)应该与ToolTipContentControl)具有相同的TemplText。但是,此工具提示应从指定的模板中获取,即在这种情况下为“TextR”。

这种方法的根本原因是最终会通过相当复杂的ContentControl(分配给DataTemplateSelector而不是ContentTemplateSelector)来选择ContentTemplate,我想要避免为常规工具提示创建类似的选择器。我宁愿在所选模板中包含工具提示,然后将其传播以覆盖整个控件。包括工具提示在内的所有元素也将更加精细,而不仅仅是TextBlock,并且使整个事物(StackPanel)成为可选模板是不切实际的。

上面的代码在整个控件没有显示工具提示的意义上不起作用;它仅显示TemplText。但是,FallbackValue也没有显示,这表明路径没有问题:它找到了元素,但可能直接从ToolTip获取null而不是DataTemplate而不是从模板。

这个问题有解决办法吗?或者只是更好的WPF方法来实现相同的结果?我是WPF的新手。

我知道{{1}}本身没有工具提示;它是其中一个元素。但我怎么能参考呢?或者我应该以某种方式使用属于模板的样式?

1 个答案:

答案 0 :(得分:0)

1.在Binding事件中的代码中设置Window.Activated

private void Window_Activated(object sender, EventArgs e)
{
    Binding b = new Binding("ToolTip");
    b.Source = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(TemplText, 0), 0);
    LayoutRoot.SetBinding(StackPanel.ToolTipProperty, b);
}

2.从ToolTip中的属性设置ViewModel

<DataTemplate x:Key="RText">
    <TextBlock x:Name="Tb" Text="TextR" ToolTip="{Binding ToolTipProp}"/>
</DataTemplate>

<StackPanel x:Name="LayoutRoot" ToolTip="{Binding DataContext.ToolTipProp, ElementName=TemplText}">