3

WPF (MVVM アプローチ) で単純な 2 レベルのツリービューを作成しようとしています。最初のレベルでは標準のデータ テンプレートを使用し、2 番目のレベルではテンプレート セレクターを使用して、各アイテムの外観をそのプロパティの 1 つに基づいて変更できるようにします。

以下は私のTreeview xamlです

<Treeview ItemsSource={Binding ListA}>
      <TreeView.ItemTemplate>
       <HierarchicalDataTemplate ItemsSource="{Binding ListB}" ItemTemplateSelector={StaticResource TemplateSelector}>
         <Textblock Text={Binding Name}/>
      </HierarchicalDataTemplate>
   </TreeView.ItemTemplate>
</TreeView>

私の最初のレベルは

<Textblock Text={Binding Name}/> 

名前だけが表示されます

私の第2レベルでは、TemplateSelectorは次のようなデータテンプレートを返しています

<DataTemplate x:Key="SomeKey">
<StackPanel Orientation="Horizontal">
<ViewBox>
-----
</ViewBox>
<TextBlock Text={Binding Name}/>
</StackPanel>
</DataTemplate>

しかし、2 番目のレベルで表示されるのは、2 番目のレベルの ViewModel 名だけです。テンプレートセレクターを再確認したところ、正しいデータテンプレートが確実に返されていますが、表示されていません。

誰でも私を正しい方向に向けることができますか?

編集 -- リクエストに応じてさらにコードを追加

これは私のテンプレートセレクターです

public class DataFieldsDataTemplateSelector : DataTemplateSelector
{
public DataTemplate AlphaTemplate { get; set; }
public ------
public ------
public DataFieldsDataTemplateSelector()
{
//This is getting the template from my ResourceDictionary
AlphaTemplate = (DataTemplate)dDictionary["alphaTemplate"];
}
public override DataTemplate SelectTemplate(object item,DependencyObject container)
        {
//Somecode
return AlphaTemplate;
}
}

私の辞書の AlphaTemplate のテンプレートは

<DataTemplate x:Key="alphaTemplate">

            <Grid >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="15"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Viewbox  IsHitTestVisible="False">

                    <Path Data="M0,0L56.622002,0 56.622002,14.471 35.715,14.471 35.715,64 20.715,64 20.715,14.471 0,14.471z" Stretch="Uniform" Fill="{DynamicResource ButtonForegroundNormal}" VerticalAlignment="Center" Width="15" Height="15" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5">
                        <Path.RenderTransform>
                            <TransformGroup>
                                <TransformGroup.Children>
                                    <RotateTransform Angle="0" />
                                    <ScaleTransform ScaleX="1" ScaleY="1" />
                                </TransformGroup.Children>
                            </TransformGroup>
                        </Path.RenderTransform>
                    </Path>

                </Viewbox>
                <textBlock Text="{Binding Name}/>
            </Grid>
    </DataTemplate>

私のクラス TypeB には Name(Text) と DataType(Text) フィールドが含まれています。DataType が Alpha の場合は、templateSelector で AlphaTemplate を返します。

ウィンドウに、アイテムを第 2 レベルに追加するアクション (dragDrop) があります。そして、テンプレート セレクターがその DataType に基づいてドロップされたアイテムの正しいデータ テンプレートを選択する必要があります。

私のメイン ViewModel には TypeA オブジェクトの ICollectionView が含まれており、各 TypeA ViewModel には TypeB ViewModel の ICollectionView が含まれています。

何か必要な場合はお知らせください

4

1 に答える 1

2

これにはコードをデバッグする必要があるため、これの何が問題なのかわかりませんが、TypeB のデフォルトの DataTemplate を定義し、次のようにバインディングに応じてコンテンツを切り替えることで、達成したいことを実行できます。

<DataTemplate DataType="{x:Type TypeB}">
    <ContentControl>
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <!-- Default template here for your item -->
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding XYZ}" Value="true">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <!-- Different template for your item -->
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>        
</DataTemplate>

ありがとう

于 2013-09-04T13:27:00.987 に答える