WPF Treeview HierarchicalDataTemplate ItemTemplateSelector

Я пытаюсь создать простой двухуровневый Treeview в WPF (подход MVVM). Для моего первого уровня у меня есть стандартная таблица данных, для моего второго уровня я хочу использовать Селектор шаблонов, чтобы я мог изменять внешний вид каждого элемента на основе одного из его свойств.

Ниже мой 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}/> 

будет просто отображать имя

Для моего второго уровня Template Selector возвращает таблицу данных, которая является чем-то вроде

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

Но все, что я вижу для моего второго уровня - это мое имя 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, я возвращаю AlphaTemplate в моем template Selector и т. д.

У меня есть действие (dragDrop) в окне, которое добавляет элементы на второй уровень. И я хочу, чтобы селектор шаблонов выбрал правильную табличку данных для этого отброшенного элемента на основе его DataType

Моя основная ViewModel содержит ICollectionView объектов TypeA, и каждая ViewA-модель TypeA содержит ICollectionView объектов TypeB ViewModels.

Дайте мне знать, если вам нужно что-нибудь

1 ответ

Решение

Я не знаю, что с этим не так, поскольку для этого потребуется отладка кода, но то, чего вы хотели добиться, можно сделать, определив шаблон DataTemplate по умолчанию для вашего TypeB и переключив содержимое в зависимости от привязки, например так:

<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>

Спасибо

Другие вопросы по тегам