【问题标题】:WPF set DataTemplate on Viewmodel class programmaticallyWPF 以编程方式在 Viewmodel 类上设置 DataTemplate
【发布时间】:2013-07-29 08:44:28
【问题描述】:

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

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

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

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

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

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

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

谁能指出我正确的方向?

【问题讨论】:

    标签: c# wpf mvvm datatemplate


    【解决方案1】:

    您可以使用隐式数据模板来发挥魔力

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

    对于“处理”或“错误”视图模型,您可以在所有您的数据模板中指定装饰器叠加层(好的,但您必须使用触发器)

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2014-10-08
      相关资源
      最近更新 更多