代码之家  ›  专栏  ›  技术社区  ›  Ralph Shillington

TreeView SelectedItem有时是VM,有时是TreeView项

  •  3
  • Ralph Shillington  · 技术社区  · 15 年前

    我有一个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>
    

    当用户单击树视图时,将显示视图模型类型名称以及名称属性的值。很完美。用户还可以执行树视图的搜索 Josh Smith )它设置TreeView项的IsSelected属性。一旦发生这种情况, {Binding} 显示TreeViewItemEx而不是ViewModel类型名称,当然不会显示Name属性。

    SelectedItem有时由ViewModel生成,有时是TreeView项,这有什么可能?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Tom Dudfield    15 年前

    如果将网格替换为 ContentControl 然后您可以使用 DataTemplateSelector .

    <ContentControl Content="{Binding ElementName=theTreeView, Path=SelectedItem}" 
                    ContentTemplateSelector="{StaticResource TreeViewItemSelector}" />
    

    数据模板选择器 然后可以为不同类型引用两个模板

        <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();
        }
    
    推荐文章