gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:17 26 4
gpt4 key购买 nike

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

  • 计算结果 View 模型,
  • ScenarioResultsViewModel,
  • GraphResultsviewModel 等等

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

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

我能想到的唯一解决方案(我知道不干净)是在每个 View 模型类的 SetResult() 方法中以编程方式设置 DataTemplate,这就是当处理成功或出错时被调用。在那个 DependencyProperty 中,我可以查看返回代码,然后根据成功/失败结果以编程方式设置 DataTemplate。唯一的问题是我不知道该怎么做

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

  2. 的属性
  3. 只有 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>

对于“处理”或“错误” View 模型,您可以在所有数据模板中指定一个装饰器覆盖层(可以,但您必须使用触发器)

希望对你有帮助

关于c# - WPF 以编程方式在 Viewmodel 类上设置 DataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com