C# 绑定到祖先树节点';数据上下文属性
我的TreeView结构定义如下:C# 绑定到祖先树节点';数据上下文属性,c#,wpf,treeview,C#,Wpf,Treeview,我的TreeView结构定义如下: <TreeView ItemsSource="{Binding RootCollection}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}"> <TextBlock Foreground="Green" Text="{Binding Text}"
<TreeView ItemsSource="{Binding RootCollection}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Foreground="Green" Text="{Binding Text}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Foreground="Black" Text="{Binding Text}" />
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
它被简化了,因为我的真实代码使用了许多自定义类
以下是来自Snoop
的视图结构:
(我需要根据标记为红色的属性设置标记为蓝色的属性)我目前无法检查此功能是否有效,因此它可能不起作用,但看起来很正常。试试这个:
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Text}">
<TextBlock.Style>
<Style>
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<DataTrigger Binding="{Binding Failed, RelativeSource={
RelativeSource AncestorType={x:Type TreeViewItem}, AncestorLevel=1}}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</HierarchicalDataTemplate>
如果它不起作用,您可以尝试一下
AncestorLevel
属性,将其设置为2或3,甚至删除它。让我知道进展如何。您可以改用模板选择器
//你把这个放在你的App.xaml中
<Application.Resources>
<HierarchicalDataTemplate x:Key="failed" ItemsSource="{Binding ChildNodes}">
<TextBlock Name="pTxt" Foreground="Red" Text="{Binding Text}" >
</TextBlock>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Foreground="Black" Text="{Binding Text}" />
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="succeded" ItemsSource="{Binding ChildNodes}">
<TextBlock Name="pTxt" Foreground="Green" Text="{Binding Text}" >
</TextBlock>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Foreground="Black" Text="{Binding Text}" />
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</Application.Resources>
//这个在你的window.xaml.cs中
<TreeView Name="treeView" ItemsSource="{Binding RootCollection}">
<TreeView.ItemTemplateSelector>
<myApp:ResourceInstDataTemplateSelector></myApp:ResourceInstDataTemplateSelector>
</TreeView.ItemTemplateSelector>
</TreeView>
我试过了,效果很好希望这有帮助你能发布你的datacontext代码吗你是说
RootCollection
?这只是一个可观察的集合
MyTreeNode
只是一个简单的类,具有属性string Text
,bool Failed
和ObservableCollection ChildNodes
好的,我们需要它,请稍后使用,它不起作用:(我以前已经尝试过这个,但没有设置“AncestorLevel”.然而-我试着将它设置为8级,但它根本没有任何作用也许这会帮助你帮助我帮助我们所有人?;)Adassko让我们知道这是否能回答你的问题谢谢,但是,失败
在运行时会动态变化,我认为这种方法不会更新DataTemplate。你有这个Adasko的解决方案吗
public class ResourceInstDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is MyTreeNode)
{
MyTreeNode treeNode = item as MyTreeNode;
DataTemplate temp = null;
if (treeNode.Failed)
temp = App.Current.Resources["failed"] as HierarchicalDataTemplate;
else
temp = App.Current.Resources["succeded"] as HierarchicalDataTemplate;
return temp;
}
return null;
}
}
<TreeView Name="treeView" ItemsSource="{Binding RootCollection}">
<TreeView.ItemTemplateSelector>
<myApp:ResourceInstDataTemplateSelector></myApp:ResourceInstDataTemplateSelector>
</TreeView.ItemTemplateSelector>
</TreeView>