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

时间:2013-07-29 08:44:28

标签: c# wpf mvvm datatemplate

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

  • CalculateResultsViewModel
  • ScenarioResultsViewModel
  • GraphResultsviewModel等等,

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

这些视图模型中的每一个都应在ListBox中以不同方式呈现,因此需要不同的DataTemplate。我只需使用XAML即可轻松完成。难点在于,当视图模型处于“处理”或“失败”时,我需要它们显示DataTemplate用于“处理”或“错误”,我只能用{{1}进行处理然而,那意味着我不能使用Triggers或基本的XAML样式。

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

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

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

  4. 有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

你可以使用隐式数据模板

<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 datatemplates中指定一个adorner overlay(好的但你必须使用触发器)

希望这会有所帮助