我觉得我在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的叶子节点..
答案 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}}
(不幸的是我现在无法测试,但至少应该让你朝着正确的方向前进)。
保持你的风格原样继续绑定属性。