WPF 非同质视图列表

Posted

技术标签:

【中文标题】WPF 非同质视图列表【英文标题】:WPF A list of non-homogeneous views 【发布时间】:2021-07-25 10:23:18 【问题描述】:

我有一个 WPF 应用程序,我想提供一个非同质视图列表。我想要一个按钮,我可以编写一个处理程序来显示一个视图。然后,由于它是一个视图,因此用户可以使用底层视图模型 (MVVM) 与其交互(例如,在 TextBox 中输入值)。所以让我进一步解释一下。我希望实现的流程是用户选择要显示的视图。视图显示在列表中。然后用户与视图的这个实例进行交互。当用户再次点击按钮时,可能会显示一个不同的视图,并且用户现在可以与两个视图交互。只要单击“添加”按钮添加到列表中的视图,这种情况就会继续。这更加复杂,因为首先,这些观点中的每一个都是不同的。应显示的特定视图取决于传递给命令的参数。其次,它很复杂,因为这些视图中的每一个都具有通过 IoC 传递并向下传递到关联视图模型的依赖项。换句话说,视图模型没有无参数的构造函数。所以我无法定义视图模型/视图关系,例如:

<Window.Resources>
   <DataTemplate DataType="x:Type views:SelectCustomerViewModel"\>
        <views:SelectCustomerView/>
    </DataTemplate>
</Window.Resources>

我进行了搜索,发现使用ItemTemplateSelector 的解决方案很接近here。但据我所知,这只是非同质显示器的解决方案。如果我恢复到视图列表,那么似乎我正在破坏 MVVM 模型,因为我必须构造一个适当的视图并分配适当的视图模型。我应该如何使用来自App.Xaml.cs 的 IoC 显示/显示不同视图的动态列表?

【问题讨论】:

【参考方案1】:

ItemTemplateSelector 是为列表中显示的(可能是不同的)项目显示不同视图(或视图的一部分)的一种完全有效的方式。在底层,这是一种策略模式的实现,其中视图是根据数据项选择的。

但是,选项卡视图似乎也符合您的条件 - 当命令被触发时,您为所需视图实例化一个新选项卡。此视图可以绑定到同一个视图模型,因此您可以在另一个选项卡上回显一个选项卡的更改。 IIRC 有一些选项卡视图实现包含类似于 ItemTemplateSelector 的内容(因为选项卡视图是列表控件的变体)。

至于 IoC - 不要担心那里的复杂性。大多数 IoC 实现将允许您指定构造函数参数值或表达式作为注册类型的一部分。

【讨论】:

那么如果要显示的视图有 TextBox 类型的输入,这是可以接受的吗?从示例中我只看到了只读/仅显示“模板”。 @KevinBurton 当然,输入控件是可以接受的。对于您看到的示例,可能存在一两个问题:1)仅使用简单的示例来说明本文的目的; 2)或使用的列表控件区分只读和可编辑模式(即网格行是这样的,它们有一个只读模板和一个编辑模板)。对于标签视图之类的东西,您不会遇到这种“模式”问题。

以上是关于WPF 非同质视图列表的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击另一个列表视图 WPF 中的元素来刷新列表视图

WPF-将列表绑定到列表视图

WPF 列表视图加载时排序

WPF - MVVM 视图模型设置

Wpf 主从列表视图绑定

从 wpf 中的文件路径列表填充树视图