我有一个TreeView,用户可以导航以选择要在网格中显示的项目。简而言之,XAML看起来像这样:
<local:TreeViewEx x:Name="theTreeView" ItemsSource="{Binding theData}">
<local:TreeViewEx.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding theChildData}">
<TextBlock Text="{Binding Name}"/>
</sdk:HierarchicalDataTemplate>
</local:TreeViewEx.ItemTemplate>
</local:TreeViewEx>
<Grid DataContext="{Binding ElementName=theTreeView, Path=SelectedItem}">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding}" />
<TextBlock Text="{Binding Name}" /></StackPanel>
</Grid>
当用户点击树视图时,将显示viewmodel类型名称以及Name属性的值。完善。用户也可以执行树视图的搜索(在Josh Smith之后),该树视图设置TreeViewItem的IsSelected属性。一旦发生这种情况,{Binding}
显示TreeViewItemEx而不是ViewModel类型名称,当然不会显示Name属性。
有时候ViewModel有时候selectedItem有可能,有时候是TreeViewItem吗?
答案 0 :(得分:1)
如果您使用ContentControl
替换网格,则可以使用DataTemplateSelector
。
<ContentControl Content="{Binding ElementName=theTreeView, Path=SelectedItem}"
ContentTemplateSelector="{StaticResource TreeViewItemSelector}" />
在DataTemplateSelector
上,您可以引用两种不同类型的模板
<DataTemplate x:Key="ModelTemplate">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
<TreeViewItemSelector x:Key="TreeViewItemSelector"
ModelTemplate="{StaticResource ModelTemplate}"
TreeItemTemplate="{StaticResource TreeItemTemplate}" />
在选择器中,您将需要像这样的逻辑
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is ModelType)
return ModelTemplate;
if (item is TreeViewItem)
return TreeItemTemplate;
throw new NotImplementedException();
}