首页 > 解决方案 > WPF 非同质视图列表

问题描述

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

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

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

标签: c#wpf.net-coremvvm

解决方案


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

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

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


推荐阅读