我覺得我錯過了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。謝謝。被你正確指出的一個重要的誤解所矇蔽。 –