我觉得我错过了WPF数据绑定中的一些基本概念。无论我的绑定是否会为我工作,总是会碰到。绑定到TreeViewItem.IsExpanded。为什么这个工作?
在这个例子中,我想双向绑定一个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>
放在UserControl.Resources时,此工作(结合为isExpanded与应用树型视图样式做
DataTemplate用于下面的Xaml片段,上面给出的数据模板用于执行数据转换。Documents是已正确绑定的FolderItems的可观察列表。
<TreeView ItemsSource="{Binding Documents}" />
两个DataTemplates都显示文件树。但在第二种情况下,对于IsExpanded没有约束力(双向或其他)。
没有展示DataTemplating为的FileItem的这是FolderItem的叶节点..
Arg。在示例中不显示,是树视图也有一个ItemTemplate,它优先于DataTemplate。但是你是正确的:在TreeView控件将TreeViewItem包装器放在数据模板对象周围之前发生数据模板化,并且TreeViewItem(与其他控件不同)不检查它是否已经是TreeViewItem。谢谢。被你正确指出的一个重要的误解所蒙蔽。 –