3

ユーザーがナビゲートしてグリッドに表示するアイテムを選択する 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>

ユーザーがツリービューをクリックすると、ビューモデルの型名が Name プロパティの値とともに表示されます。完全。ただし、ユーザーは TreeViewItem の IsSelected プロパティを設定するツリービューの検索を ( Josh Smithに従って) 実行することもできます。これが発生する{Binding}と、ViewModel 型名ではなく TreeViewItemEx が表示され、もちろん Name プロパティは表示されません。

selectedItem が ViewModel の場合もあれば、TreeViewItem の場合もある可能性はありますか?

4

1 に答える 1

1

グリッドを に置き換えると、ContentControlを使用できますDataTemplateSelector

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

で、DataTemplateSelector異なるタイプの 2 つのテンプレートを参照できます。

    <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();
    }
于 2011-02-16T12:56:29.990 に答える