C# 绑定到祖先树节点';数据上下文属性

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结构定义如下:

<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>