Ответ 1
Я обычно использую ContentControl
для отображения данных и заменяю ContentTemplate
в триггере на основе изменяющегося свойства.
Вот пример, который я опубликовал в моем блоге, который свопирует шаблон на основе связанного свойства
<DataTemplate x:Key="PersonTemplate" DataType="{x:Type local:ConsumerViewModel}">
<TextBlock Text="I'm a Person" />
</DataTemplate>
<DataTemplate x:Key="BusinessTemplate" DataType="{x:Type local:ConsumerViewModel}">
<TextBlock Text="I'm a Business" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ConsumerViewModel}">
<ContentControl Content="{Binding }">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource PersonTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ConsumerType}" Value="Business">
<Setter Property="ContentTemplate" Value="{StaticResource BusinessTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
A DataTemplateSelector
также будет работать, но только если свойство, которое определяет, какой шаблон показывать, не изменяется, поскольку DataTemplateSelectors
не отвечает на уведомления об изменении. Я обычно избегаю их, если это возможно, так как я также предпочитаю свою логику выбора в моем представлении, чтобы я мог видеть, что происходит.