19

タスクにバインドされた項目コントロールがあります。各タスクにはタスク状態があります。タスクの状態ごとに異なるデータ テンプレートを定義し、データ テンプレート セレクターも定義しました。

問題は、タスクの状態が動的に変更されたときにデータ テンプレート セレクターをトリガーする方法を理解できないことです。

データ トリガーをデータ テンプレートと一緒に使用する方法を知りたいです。

これがうまくいかない場合は、次のような他の代替手段を検討し
ます。1. タスク状態にバインドされた添付プロパティ。変更すると、データ テンプレートが動的に設定されます。
2. ビジュアル ステート マネージャー

4

2 に答える 2

54

Aは通知にDataTemplateSelector応答しないためPropertyChange、プロパティが変更されても再評価されません。

私が使用する別の方法は、プロパティに基づいてDataTriggersを変更することです。Template

たとえば、これはTaskModelを使用してすべてのオブジェクトを描画しContentControl、は のプロパティにContentControl.Template基づいています。TaskStatusTaskModel

<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>
于 2012-10-30T15:45:33.040 に答える
8

私と同じように、これが信じられないほど役に立ったと思った人への簡単なメモ-

現在 WPF では、DataTemplate 定義でTargetTypeではなくDataTypeを使用する必要があるようです。

<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>
于 2015-04-17T04:12:29.703 に答える