Treeview SelectedItem有时是VM,有时是TreeViewItem

时间:2010-09-09 13:13:23

标签: mvvm silverlight-4.0 mvvm-light silverlight-toolkit

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

1 个答案:

答案 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();
    }