Недавно я обнаружил свойство ItemTemplateSelector ItemsControl, которое позволяет вам предоставлять разные шаблоны данных для каждого элемента в ItemsControl, зависит от некоторой логики, выполняемой во время выполнения.
Похоже на Setter, но более элегантно.
Сначала определите класс, производный от DataTemplateSelector.Правильно сделать это в коде файла * .cs (так как он является частью View).
public class CategoryTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Category category = item as MusicViewModel.Category;
FrameworkElement element = container as FrameworkElement;
string key = (category.Count) > 0 ? "Category" : "EmptyCategory";
DataTemplate dt = element.FindResource(key) as DataTemplate;
return dt;
}
}
Затем на панели стека определите два шаблона данных как ресурсы, а такжекак селектор:
<StackPanel Name="CatagoryPanel" Grid.Row="2" Grid.ColumnSpan="6">
<StackPanel.Resources>
<DataTemplate x:Key="EmptyCategory">
<StackPanel><Expander /><DataGrid /></StackPanel>
</DataTemplate>
<DataTemplate x:Key="Category">
<Expander />
</DataTemplate>
<gms:CategoryTemplateSelector x:Key="selector" />
</StackPanel.Resources>
<!-- now, define the actual ItemsControl: -->
<ItemsControl ItemsSource="{Binding }" ItemTemplateSelector="{StaticResource selector}" />
</StackPanel>
Лично я нахожу этот подход чище, чем триггеры, хотя логически они очень похожи.
Надеюсь, это помогло.