Поскольку вы хотите изменить шаблоны на основе привязанного значения, вы можете использовать DataTrigger
для определения ContentTemplate
ListBoxItem
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}"/>
<Style.Triggers>
<DataTrigger Property="{Binding SomeProperty}" Value="A">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateA}"/>
</DataTrigger>
</Style.Triggers>
</Style>
Я считаю, что это лучше, чем использование DataTemplateSelector
, потому что оно переоценивается, если связанное свойство изменяется, а DataTemplateSelector
- нет.
Если вы хотите изменить шаблоны на основе типа объекта, вы можете использовать Implicit DataTemplates
. Это DataTemplates
, которые определяют DataType
, но не x:Key
, и они будут использоваться каждый раз, когда WPF пытается нарисовать объект указанного типа.
Например, если у вас есть этот шаблон, определенный в вашем <X.Resources>
где-то
<DataTemplate DataType="{x:Type models:ActionA}">
<views:ActionAView />
</DataTemplate>
затем вы можете вставить свой объект модели непосредственно в пользовательский интерфейс, и WPF нарисует его, используя указанный вами шаблон.
<ContentControl Content="{Binding SomeIActionObject}" />
<ItemsControl ItemsSource="{Binding CollectionOfIActionObjects}" />
Обновить
Вы упомянули, что позволите пользователям создавать модули с дополнительными шаблонами, которые импортируются с помощью MEF, поэтому в этом случае вам, вероятно, будет лучше использовать IValueConverter, которые ищут соответствующий шаблон в Application.Resources
Например, если связанное значение равно "A"
, тогда преобразователь может искать Application.Resources
шаблон с именем "TemplateA"
и возвращать его привязке
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate"
Value="{Binding SomeProperty,
Converter={StaticResource MyTemplateConverter}}"/>
</Style>
person
Rachel
schedule
26.03.2013
flags
решением (решение 2) stackoverflow.com/questions/15550344/ - (и вы можете сопоставить это не только с двумя вариантами и т. д.) - но есть способ получше, который я часто использую. - person NSGaga-mostly-inactive   schedule 26.03.2013<DataTemplate View="{Binding View}"/>
где View - это свойство в DataTemplate для ListBox. - person Dread Pirate Peter   schedule 26.03.2013