Я хочу иметь условный XAML, который выбирает этот TreeView.Resources
или другой.
Я использую MaterialDesignInXAML инструментарий * Card
и внутри него находится TreeView
.
Допустим, у меня есть коллекция Фрукты , внутри которой есть еще одна коллекция под названием Деревья .
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type domain:Tree}" ItemsSource="{Binding Fruits}">
// tree information here ...
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type domain:Fruit}">
// fruit information here ...
</DataTemplate>
</TreeView.Resources>
Проблема здесь, естьфрукты, которые не растут на деревьях. Итак, я хочу иметь другой ресурс, но все равно продолжу шаблон.
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type domain:Fruit}">
// fruit information here
</HierarchicalDataTemplate>
</TreeView.Resources>
Я хочу, чтобы мой вывод выглядел так:
> Apple Tree
- Apples
> Mango Tree
- Mangoes
> Watermelon
Редактировать :
Я использовал второе предложение @ BionicCode , которое должно использовать DataTemplateSelector
. Я добавил это в свой XAML:
<UserControl DataContext="{Binding ViewModel}">
<UserControl.Resources>
<domain:DtmSelector x:Key="DtmSelector">
<domain:DtmSelector.WithTree>
<HierarchicalDataTemplate DataType="{x:Type domain:Tree}" ItemsSource="{Binding Fruits}">
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate DataType="{x:Type domain:Fruit}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</domain:DtmSelector.WithTree>
<domain:DtmSelector.WithoutTree>
<DataTemplate DataType="{x:Type domain:Tree}">
<TextBlock Text="{Binding Fruits[0].Name}"/>
</DataTemplate>
</domain:DtmSelector.WithoutTree>
</domain:DtmSelector>
</UserControl.Resources>
<TreeView
ItemsSource="{Binding Trees}"
ItemTemplateSelector="{StaticResource DtmSelector}"
/>
</UserControl>
И в моем DtmSelector.cs :
public class DtmSelector: DataTemplateSelector
{
public DataTemplate WithTrees { get; set; }
public DataTemplate WithoutTrees { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Tree key = item as Tree;
if (key.Fruits.Count() == 0)
{
return WithTrees;
}
else
{
if (key.Fruits.Select(c=>c.Name).Contains(key.Name))
{
return WithTrees;
}
else
{
return WithoutTrees;
}
}
}
}
Моя концепция ViewModel
выглядит следующим образом:
foreach (var item in fruits)
{
if ( item.Tree == null)
{
if (!Trees.Select(c => c.Name).Contains(item.Name))
{
Trees.Add(new Tree(item.Name));
}
foreach (var tree in Trees.ToList())
{
if (tree.Name == item.Name)
{
tree.Fruits.Add(item);
}
}
}
else
{
if (!Trees.Select(c => c.Name).Contains(item.Tree.Name))
{
Trees.Add(item.Tree);
}
foreach (var tree in Trees.ToList())
{
if (tree.Name == item.Tree.Name)
{
tree.Fruits.Add(item);
}
}
}
}
ПРОБЛЕМА
Этот набор кодов сначала проверит Trees
без добавления Fruits
. Таким образом, эта строка if (key.Fruits.Count() == 0)
всегда будет возвращать true
. Есть ли что-то, что я могу сделать? Я что-то упустил?
Я нашел ответ из другой ветки , который мог бы помочь, однако я не знаю, как это будет работать в ViewModel, как я могу выбрать определенныйсеттер по переплету Property
.