2

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

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

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

Для моего второго уровне TemplateSelector возвращается в DataTemplate, который что-то вроде

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

Но все, что я вижу для своего второго уровня, это мое второе имя ViewModel уровня. Я дважды проверил селектор шаблонов и, безусловно, вернул правильный шаблон данных, но он просто не отображается.

Может ли кто-нибудь указать мне в правильном направлении?

Edit - Добавлен дополнительный код согласно запросу

это мой селектор шаблона

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 содержит имя (Text) и DataType (Text) , если DataType является Alpha, я возвращаю AlphaTemplate в свой шаблонSelector и т. Д.

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

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

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

+0

я попробовал этот scenerio в моем конце он работал нормально. Можете ли вы поделиться кодом селектора шаблонов, как xaml, так и кодом, и ваш тип класса ListB – Nitin

+0

Я добавил еще код в свой исходный вопрос. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще. – Krishna

+0

Не знаю, брат, я пробовал работать здесь отлично. Задайте шаблоны из словаря, и они применяются. Вы видите, что вы получаете какие-либо обязательные исключения в окне вывода? – Nitin

ответ

2

Я не знаю, что случилось с этим, поскольку это потребует отладки кода, но то, что вы хотите достичь может быть сделано путем определения 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> 

Благодаря

+0

Спасибо за ваш ответ. Ваше решение с использованием триггеров будет работать, но я пытаюсь найти общее решение, поскольку я пытаюсь повторно использовать тот же шаблонSelector, который я использовал для Listbox в другом месте проекта. Также я получил более 15 наборов данных для элемента TypeB, и я хотел сохранить их всех в одном месте. Другой список, в котором я использую тот же шаблон TemplateSelector, работает нормально, хотя (он отображает правильный шаблон данных) – Krishna

Смежные вопросы