web-dev-qa-db-ja.com

データテンプレートを動的に変更する

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

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

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

これがうまくいかない場合は、次のような他の選択肢を検討します
1。タスク状態にバインドされた添付プロパティ。変更を加えると、データテンプレートが動的に設定されます。
2。 Visual State Manager

16
Tilak

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

私が使用する代替手段は、プロパティに基づいてDataTriggersを変更するTemplateです。

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

<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>
49
Rachel

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

現在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>
7
Noth