c# - 如何在属性更改时触发 DataTemplateSelector?

标签 c# wpf datatemplateselector

我有 ContentPresenter 和 DataTemplateSelector:

    ...

    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。有什么建议吗?

类似的问题有: 1 2 ,但我不想使用任何 DataTriggers,因为状态太多。

尝试使用 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 :(

最佳答案

由于您在评论中请求了一个带有数据触发器的示例,所以您在这里:

FrameworkElement 只能有 EventTriggers,因此您会收到错误消息 Triggers collection members must be of type EventTrigger

并且也不要直接使用 ContentPresenter,它应该在 ControlTemplate 中使用。当您想要动态内容时,最好使用 ContentControl。 参见 What's the difference between ContentControl and ContentPresenter?

最后,这是对您的 DataTrigger 问题的建议。我已将其放入可重用的样式中......

XAML:

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

关于c# - 如何在属性更改时触发 DataTemplateSelector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715315/

相关文章:

WPF 绑定(bind)开销

c# - 获取用于在 Windows 服务中进行 Web 服务调用的接口(interface)的本地 IP 地址

c# - 如何调试CaSTLe Windsor安装/注册异常

c# - 无法加载文件或程序集 'System, Version=4.0.0.0, Culture=neutral' 或其依赖项之一

wpf - 第二次尝试将内容绑定(bind)到窗口时出错

c# - WPF:更改 ContentControl 的内容时,新的内容对象不会触发加载的事件

wpf - 通过 DataTemplate 的分隔符

c# - 为什么 WPF 在我的案例中不选择正确的 DataTemplate?

c# - 在运行时切换 wpf 资源字典

c# - 扩展 WinForm UserControl 基类的正确体系结构?