Обмен шаблонами управления
У меня есть проект WPF (C#, Visual Studio 2010, MVVM), и у меня есть вопрос.
В настоящее время у меня есть шаблон элемента в ListBox. Это выглядит следующим образом:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="DragDelta">
<cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Thumb>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
Шаблон "NodeVisualTemplate" представляет собой серию элементов управления (например, границы и текстовые поля).
То, что я не знаю, как сделать, и что я хотел бы сделать, - это возможность поменять этот шаблон на другой, основываясь на свойствах этого элемента. В ListBox каждый ListBoxItem имеет контекст данных, который является "ChatNodeViewModel". Я надеялся иметь свойство в том, что будет диктовать, какой шаблон был использован.
Это возможно? Если так, как это можно сделать?
3 ответа
Вы могли бы использовать <DataTemplate.Triggers>
как это:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="DragDelta">
<cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Thumb>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding YourProperty}" Value="1">
<Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateOne}" />
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="2">
<Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateTwo}" />
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="3">
<Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateThree}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
Попробуйте использовать DataTrigger
<DataTrigger Binding="{Binding ElementName=myElement,Path=IsChecked}"
Value="True">
<Setter Property="Template"
Value="{StaticResource myTemplate}"/>
</DataTrigger>
Например, приведенное выше поменяет шаблон, если установлен флажок
Вы можете использовать стиль Thumb с шаблоном в DataTrigger и привязать его к свойству в ViewModel, т.е. YourProperty
,
<Thumb>
<Thumb.Style>
<Style TargetType="Thumb">
<Setter Property="Template" Value="{StaticResource NodeVisualTemplate}"/>
<!--default Template ^-->
<Style.Triggers>
<DataTrigger Binding="{Binding YourProperty}" Value="0">
<Setter Property="Template" Value="{StaticResource TemplateOn0}"/>
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="1">
<Setter Property="Template" Value="{StaticResource TemplateOn1}"/>
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="2">
<Setter Property="Template" Value="{StaticResource TemplateOn2}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Thumb.Style>
</Thumb>
Пример реализации свойства:
public int YourProperty {set;get;} = 0;
Вы также можете использовать некоторые Enum, чтобы легче понять, какой шаблон какой, или даже строку.
Если вы хотите просто поменять шаблон ListBoxItem, вы можете использовать встроенный в Listbox ItemTemplateSelecetor. Вот образец