绑定到TreeViewItem.IsExpanded.为什么这样做?

Rob*_*ies 5 wpf treeviewitem

我觉得我在WPF数据绑定中缺少一些基本概念.我的装订是否会对我有用,这总是一杆三风.

在此示例中,我希望将TreeViewItem的IsExpanded属性双向绑定到绑定对象上的相应属性.它确实适用于第一个例子; 它与第二个没有关系.

有谁能解释为什么?我无法理解为什么第二个版本不起作用.如果可以的话,我不禁想到它会拯救我无尽的悲伤.

这在放入UserControl.Resources时有效(绑定到IsExpanded是通过应用于TreeViewItem的Style完成的:

    <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" 
              Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
    </Style>
    <DataTemplate DataType="{x:Type viewModels:FolderItem}">
        <TreeViewItem ItemsSource="{Binding Folders}" 
           IsExpanded="{Binding Mode=TwoWay,Path=IsExpanded}" >
            <TreeViewItem.Header>
                <StackPanel Orientation="Vertical">
                    <Image Source="{Binding IconSource}" 
                          Width="16" Height="16" 
                           Margin="4,0,4,0" VerticalAlignment="Center" />
                    <TextBlock Text="{Binding Title}" 
                            VerticalAlignment="Center" />
                </StackPanel>
            </TreeViewItem.Header>
        </TreeViewItem>
    </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

这不(在数据模板中直接绑定到IsExpanded):

    <DataTemplate DataType="{x:Type viewModels:FolderItem}">
        <TreeViewItem ItemsSource="{Binding Folders}" 
           IsExpanded="{Binding Path=IsExpanded,Mode=TwoWay}" >
            <TreeViewItem.Header>
                <StackPanel Orientation="Vertical">
                    <Image Source="{Binding IconSource}" 
                          Width="16" Height="16" Margin="4,0,4,0"
                          VerticalAlignment="Center" />
                    <TextBlock Text="{Binding Title}"
                        VerticalAlignment="Center" />
                </StackPanel>
            </TreeViewItem.Header>
        </TreeViewItem>
    </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

DataTemplate用于以下Xaml片段,上面给出的数据模板用于执行数据转换.Documents是已正确绑定的FolderItems的可观察列表.

   <TreeView ItemsSource="{Binding Documents}" />
Run Code Online (Sandbox Code Playgroud)

两个DataTemplates都显示文件树.但在第二种情况下,IsExpanded没有绑定(双向或其他方式).

未显示FileTtem的DataTemplating,它是FolderItem的叶节点.

Ada*_*son 8

问题是它TreeViewItem实际上是一个自己使用的包装器TreeView.它不需要(也不应该)成为你的一部分DataTemplate,因为你现在所拥有的是TreeViewItem在a中创建一个TreeViewItem(外部创建一个TreeView,内部一个是模板的一部分).

这就是为什么你的风格适用于所有 TreeViewItem s的原因,既是你声明的那个(最终没有意义),也是由你创造的那个TreeView.

你应该做的是DataTemplate用这个替换你:

<HierarchicalDataTemplate ItemsSource="{Binding Folders}">
    <StackPanel Orientation="Vertical">
        <Image Source="{Binding IconSource}" 
               Width="16" Height="16" Margin="4,0,4,0"
               VerticalAlignment="Center" />
        <TextBlock Text="{Binding Title}"
                   VerticalAlignment="Center" />
<HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)

(不幸的是我现在无法测试,但至少应该让你朝着正确的方向前进).

保持原样的样式以继续绑定属性.

  • 精氨酸.在示例中没有显示,树视图也有一个ItemTemplate,它优先于DataTemplate.但你是对的:在TreeView控件将TreeViewItem包装器放在数据模板化对象周围之前发生数据模板化,而TreeViewItem(与其他控件不同)不会检查它是否已经是TreeViewItem.谢谢.被正确指出的一个重要的误解蒙蔽了眼睛. (2认同)