プロパティが変更されたときに DataTemplateSelector をトリガーするにはどうすればよいでしょうか? 質問する

プロパティが変更されたときに DataTemplateSelector をトリガーするにはどうすればよいでしょうか? 質問する

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>

おすすめ記事