C# WPF以编程方式在Viewmodel类上设置DataTemplate

C# WPF以编程方式在Viewmodel类上设置DataTemplate,c#,wpf,mvvm,datatemplate,C#,Wpf,Mvvm,Datatemplate,我在WPF中有一个列表框,其中包含ResultsViewModel项的列表,但是这些对象的实际运行时类型可能是 计算结果视图模型 场景结果视图模型 图形结果视图模型等 所有这些都扩展了基础抽象类ResultsViewModel 每个视图模型在列表框中的呈现方式都应该不同,因此需要不同的数据模板。我可以用XAML轻松做到这一点。困难在于,当viewmodels处于“处理”状态或出现故障时,我需要它们显示一个用于“处理”或“出错”的DataTemplate,目前为止我只能使用触发器。这意味着我不

我在WPF中有一个列表框,其中包含
ResultsViewModel
项的列表,但是这些对象的实际运行时类型可能是

  • 计算结果视图模型
  • 场景结果视图模型
  • 图形结果视图模型
所有这些都扩展了基础抽象类
ResultsViewModel

每个视图模型在
列表框中的呈现方式都应该不同,因此需要不同的
数据模板。我可以用XAML轻松做到这一点。困难在于,当viewmodels处于“处理”状态或出现故障时,我需要它们显示一个用于“处理”或“出错”的
DataTemplate
,目前为止我只能使用
触发器
。这意味着我不能使用
DataTemplateSelector
或基本的XAML样式

我能想到的唯一解决方案(我知道不是干净的)是在
SetResult()中以编程方式设置
DataTemplate
每个viewmodel类的方法,这是在处理成功完成或出现错误时调用的。在这种情况下,
DependencyProperty
我可以查看返回代码,然后根据成功/失败的结果以编程方式设置
DataTemplate
。唯一的问题是我不知道如何

  • 仅使用c#code从
    ResourceDictionary
    获取
    DataTemplate
    资源-请记住,我从viewmodel类调用了所有这些,而不是从window code behind.xaml.cs文件调用,因此它无法访问
    window

  • 只有viewmodel类的句柄,以某种方式获取对包含它的
    ListBoxItem
    的引用,然后在此容器上以编程方式设置
    DataTemplate


  • 有人能给我指出正确的方向吗?

    你可以利用隐式数据模板的魔力

    <ListBox ItemSource={Binding YourResults}>
      <ListBox.Resources>
        <DataTemplate DataType={x:Type CalculateResultsViewModel}>
          <Grid></Grid>
        </DataTemplate>
        <DataTemplate DataType={x:Type ScenarioResultsViewModel}>
          <Grid></Grid>
        </DataTemplate>
        <DataTemplate DataType={x:Type GraphResultsviewModel }>
          <Grid></Grid>
        </DataTemplate>
      </ListBox.Resources>
    </ListBox>
    
    
    
    对于“处理”或“出错”视图模型,您可以在所有yout数据模板中指定装饰器覆盖(可以,但必须使用触发器)

    希望这有帮助