タスクにバインドされているアイテムコントロールがあります。各タスクにはタスクの状態があります。タスクの状態ごとに異なるデータテンプレートを定義し、データテンプレートセレクターも定義しました。
問題は、タスクの状態が動的に変更されたときにデータテンプレートセレクターをトリガーする方法がわからないことです。
データトリガーをデータテンプレートと一緒に使用する方法を知りたいです。
これがうまくいかない場合は、次のような他の選択肢を検討します
1。タスク状態にバインドされた添付プロパティ。変更を加えると、データテンプレートが動的に設定されます。
2。 Visual State Manager
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>
私のようにこれが信じられないほど役に立ったと思った人への簡単なメモ-
現在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>