Я пытаюсь создать простой двухуровневый 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.
Позвольте мне знать, если вам нужно что-нибудь
я попробовал этот scenerio в моем конце он работал нормально. Можете ли вы поделиться кодом селектора шаблонов, как xaml, так и кодом, и ваш тип класса ListB – Nitin
Я добавил еще код в свой исходный вопрос. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще. – Krishna
Не знаю, брат, я пробовал работать здесь отлично. Задайте шаблоны из словаря, и они применяются. Вы видите, что вы получаете какие-либо обязательные исключения в окне вывода? – Nitin