【问题标题】:WPF MVVM: Approach to chose for dynamic selection of UserControl to display object acording to its type [closed]WPF MVVM:选择动态选择UserControl以根据其类型显示对象的方法[关闭]
【发布时间】:2021-06-23 10:28:02
【问题描述】:

在我的应用程序中,我需要管理 (CRUD) 主题和关于该主题的不同活动的集合,这些活动由不同的类表示,它们是公共活动类的直接或间接子类。

对于这个主题,我想创建 ViewModel,它还包含活动 ViewModel 的集合。

例如,像高级包裹跟踪,包含关于收件人、寄件人等的通用信息,以及不同的异构操作,如在邮局收到(国家、代码)、通过冰箱发送(温度数据、时间、司机等),海关清关(收费,官员)。

所以,为了表示这个集合,我需要将不同的 UI 控件(我认为使用 UserControls)动态加载到视图的容器中。

我的问题是关于使用 MVVM 将活动与其 UI 控件相关联的工业和常见方式是什么

【问题讨论】:

  • 这就是 DataTemplates 的用途。声明 DataTemplate 资源,这些资源的 DataType 属性设置为它们应该可视化的视图模型类型。然后将特定视图模型的实例分配给 ContentControl 或将其作为 ItemsControl 的 ItemsSource 的元素,并且将自动选择适当的 DataTemplate。见Data Templating Overview
  • 您的 DataTemplates 当然可能包含您自己的 UserControls 的声明。避免显式设置 UserControls 的 DataContext 的常见错误。尽管您会在许多博客文章中找到这个“建议”,但这是错误的,因为它破坏了数据绑定在 WPF 中的工作方式。
  • 谢谢你,克莱门斯。不幸的是,我看到你的答案只是评论,但它是解决方案和答案
  • 我已经投票结束这个问题,因为我认为它太宽泛了,即不是关于特定的编程问题。不过我可能错了……
  • 我们知道的不够多,无法给出一个好的答案。可能是这些东西重叠,所以 itemscontrol 不是一个好方法。类型可能不是理想的驱动程序,因此数据模板选择器可能更合适。嵌套控件可能是一个想法。

标签: c# wpf xaml mvvm


【解决方案1】:

基本上,您将为具有某种项目控制(ItemsControlListView、...)的主题设计 UI,并为每个具体的活动视图模型类型提供类型相关的 DataTemplate。这个DataTemplate 可以通过显示一些用户控件或做其他任何事情来实现。

<ItemsControl ItemsSource="{Binding Activities}">
  <ItemsControl.Resources>
    <DataTemplate DataType="{x:Type vm:CleaningActivityViewModel}">
      <uc:CleaningActivityUserControl/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:HappyGoLuckyActivityViewModel}">
      <uc:HappyGoLuckyUserControl/>
    </DataTemplate>
  </ItemsControl.Resources>
</ItemsControl>

在此代码示例中,vm 是 viewmodel 命名空间的 xmlns 声明,uc 是 usercontrol 命名空间的 xmlns 声明。

这种方法有很大的空间依赖于用例的变化。 ItemsControl 可以自定义(例如设置ItemsControl.ItemsPanel)或替换为不同的项目主机。如果DataType 并非在所有情况下都适用以决定正确的用户界面,那么ItemsControl.ItemTemplateSelector 可能是合适的。

【讨论】:

  • 感谢您将 TargetType 更正为 DataType ;)
  • 并在此处添加{x:Type ...}
  • @Clemens 哇,我真的应该回到在 VS 中实现答案,而不是直接将它们写入浏览器^^
  • 然后运行程序。如果没有 x:Type,它会成功编译,但不会工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多