我想将一个对象的属性绑定到其子对象之一的类似属性,而这个子内容(包括所讨论的属性的值)是从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
自己的属性(这不会显示在代码段中)。我想无论如何这个问题都没关系,但我确实需要这一行。
这个想法是这样的:整个StackPanel
(LayoutRoot
)应该与ToolTip
(ContentControl
)具有相同的TemplText
。但是,此工具提示应从指定的模板中获取,即在这种情况下为“TextR”。
这种方法的根本原因是最终会通过相当复杂的ContentControl
(分配给DataTemplateSelector
而不是ContentTemplateSelector
)来选择ContentTemplate
,我想要避免为常规工具提示创建类似的选择器。我宁愿在所选模板中包含工具提示,然后将其传播以覆盖整个控件。包括工具提示在内的所有元素也将更加精细,而不仅仅是TextBlock
,并且使整个事物(StackPanel
)成为可选模板是不切实际的。
上面的代码在整个控件没有显示工具提示的意义上不起作用;它仅显示TemplText
。但是,FallbackValue
也没有显示,这表明路径没有问题:它找到了元素,但可能直接从ToolTip
获取null
而不是DataTemplate
而不是从模板。
这个问题有解决办法吗?或者只是更好的WPF方法来实现相同的结果?我是WPF的新手。
我知道{{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}">