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

时间:2014-01-14 20:49:29

标签: wpf treeviewitem

我觉得我在WPF数据绑定中缺少一些基本概念。我的绑定对我来说是否会起作用总是有点不可思议。

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

任何人都可以解释原因吗?我无法理解为什么第二个版本不起作用。如果可以的话,我无法帮助它认为这会让我无法忍受悲伤。

当置于UserControl.Resources中时(包含应用于TreeViewItem的样式完成对IsExpanded的绑定:

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

这不(在数据模板中直接绑定到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>

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

   <TreeView ItemsSource="{Binding Documents}" />

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

FileTetem的DataTemplating没有显示,它们是FolderItem的叶子节点..

1 个答案:

答案 0 :(得分:8)

问题是TreeViewItem实际上是TreeView本身使用的包装器。它不需要(也不应该)成为您DataTemplate的一部分,因为您现在所拥有的是在TreeViewItem内创建TreeViewItem(由TreeView创建的外部TreeViewItem 1}},内部的一个是模板的一部分)。

这就是为什么你的风格适用于所有 TreeView s的原因,你声明的那个(最终没有意义)和由你创建的那个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> 替换为:

{{1}}

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

保持你的风格原样继续绑定属性。