Подтвердить что ты не робот

Динамический шаблон изменения данных

У меня есть элемент управления, который связан с задачами. Каждая задача имеет состояние задачи. Я определил разные шаблоны данных для каждого состояния задачи, а также селектор шаблонов данных.

Проблема в том, что я не могу понять, как запускать селектор шаблонов данных, когда состояние задачи изменяется динамически.

Я хочу знать, как использовать триггеры данных вместе с шаблонами данных.

Если это не сработает, я изучу другие альтернативы, например, 1. Attached Property привязано к состоянию задачи. Любые изменения будут динамически задавать шаблон данных.
2. Менеджер визуальных состояний

4b9b3361

Ответ 1

A DataTemplateSelector не отвечает на уведомления PropertyChange, поэтому он не переоценивается при изменении свойств.

Альтернативой, которую я использую, является DataTriggers, который изменяет Template на основе свойства.

Например, это будет рисовать все объекты TaskModel с помощью ContentControl, а ContentControl.Template основывается на свойстве TaskStatus для TaskModel

<DataTemplate x:Key="OpenTaskTemplate" TargetType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm an Open Task" />
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" TargetType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm a Closed Task" />
 </DataTemplate>

<DataTemplate DataType="{x:Type local:TaskModel}">
     <ContentControl Content="{Binding }">
         <ContentControl.Style>
             <Style TargetType="{x:Type ContentControl}">

                 <!-- Default Template -->
                 <Setter Property="ContentTemplate" Value="{StaticResource OpenTaskTemplate}" />

                 <!-- Triggers to change Template -->
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding TaskStatus}" Value="Closed">
                         <Setter Property="ContentTemplate" Value="{StaticResource ClosedTaskTemplate}" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </ContentControl.Style>
     </ContentControl>
 </DataTemplate>

Ответ 2

Просто краткая заметка для тех, кто нашел это невероятно полезным, как и я, -

В настоящее время с WPF похоже, что вы захотите использовать DataType, а не TargetType в своих определениях DataTemplate:

<DataTemplate x:Key="OpenTaskTemplate" DataType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm an Open Task" />
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" DataType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm a Closed Task" />
 </DataTemplate>