2

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

  • CalculateResultsViewModel,
  • ScenarioResultsViewModel,
  • GraphResultsviewModel等等等等,

所有这些都扩展了基础抽象类ResultsViewModel

这些视图模型中的每一个都应该以不同的方式呈现,ListBox因此需要不同的DataTemplate. 我可以很容易地使用 XAML 做到这一点。困难在于,当视图模型“处理”或“失败”时,我需要它们显示DataTemplate“处理”或“错误”,到目前为止我只能这样做Triggers。但这意味着我不能使用DataTemplateSelector或基本 XAML 样式。

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

  1. 从仅使用 c# 代码中获取DataTemplate资源ResourceDictionary- 请记住,我从 viewmodel 类调用所有这些,而不是窗口代码隐藏 .xaml.cs 文件,因此它无权访问Window

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

谁能指出我正确的方向?

4

1 回答 1

2

you can take the magic with implicit datatemplates

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

for "processing" or "errored" viewmodels you can specify a adorner overlay in all yout datatemplates (ok but you must use the triggers)

hope this helps

于 2013-07-29T09:21:19.993 回答