DataTemplateSelector を備えた ContentPresenter があります:
...
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var model = item as ItemControlViewModel;
if (model.CurrentStatus == PrerequisitesStatus.Required)
{
return RequiredTemplate;
}
if (model.CurrentStatus == PrerequisitesStatus.Completed)
{
return FinishedTemplate;
}
...
return InProgressTemplate;
}
CurrentStatus が変更されると、OnPropertyChanged が呼び出されます。
プロパティが変更されたときにこの DataTemplateSelector を何らかの方法でトリガーし、ContentPresenter DataTemplate を変更する必要があります。何か提案はありますか?
同様の質問が3つあります:1 2ただし、状態が多すぎるため、DataTrigger は使用したくありません。
DataTriggersを試してみた
<ContentPresenter
Grid.Column="1"
Height="16"
Width="16"
Margin="3">
<ContentPresenter.Triggers>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
<Setter Property="ContentPresenter.ContentTemplate" Value="{StaticResource ResourceKey=_requiredStatusTemplate}" />
</DataTrigger>
</ContentPresenter.Triggers>
</ContentPresenter>
しかしエラーが発生しました: トリガー コレクション メンバーは EventTrigger 型である必要があります :(
ベストアンサー1
コメントでデータトリガーを使用した例をリクエストされたので、ここに示します。
FrameworkElementはEventTriggersのみを持つことができるため、エラーメッセージが表示されます。トリガーコレクションのメンバーはEventTrigger型である必要があります
また、ContentPresenterを直接使用しないでください。これはControlTemplate内で使用することを意図しています。動的なコンテンツが必要な場合は、ContentControlを使用することをお勧めします。ContentControl と ContentPresenter の違いは何ですか?
最後に、DataTrigger の問題に対する提案です。再利用性のためにスタイル内に組み込んでおきました。
: ...
<Window x:Class="WpfApplication88.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="requiredTemplate">
<TextBlock Text="requiredTemplate"></TextBlock>
<!--your stuff here-->
</DataTemplate>
<DataTemplate x:Key="completedTemplate">
<TextBlock Text="CompletedTemplate"></TextBlock>
<!--your stuff here-->
</DataTemplate>
<Style x:Key="selectableContentStyle" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Required">
<Setter Property="ContentTemplate" Value="{StaticResource requiredTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Completed">
<Setter Property="ContentTemplate" Value="{StaticResource completedTemplate}" />
</DataTrigger>
<!-- your other Status' here -->
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<ContentControl Width="100" Height="100" Style="{StaticResource selectableContentStyle}"/>
</Grid>
</Window>