将多个视图绑定到多个视图模型

本文关键字:视图 模型 绑定 | 更新日期: 2023-09-27 18:37:14

我有一个WPF窗口显示不同的自定义视图。到目前为止,我能够使用我学到的有关 MVVM 的所有知识:)

现在我遇到了一个新的"问题":我在更大的视图中有 10 个相同视图的实体。这十个视图实体包含一组控件(文本框、组合框等),但都是一致的。

那么如何将这些视图绑定到视图模型呢?

我考虑在"更高级别"的 ViewModel 中拥有 10 个视图模型实例,并将视图固定定义的 VM 实例作为数据上下文。

我现在的问题是 --> 是否有一种更简单(或更方便)的方法来将许多(相同)视图绑定到他们的视图模型?

代码示例:

查看模型:

private PanelViewModel _panelViewModel1 = new PanelViewModel();
public PanelViewModel PanelVM1
{
   get { return _panelViewModel1; }
}  

查看示例:

<myControls:vwPanel HorizontalAlignment="Left" x:Name="vwPanel1" 
                    VerticalAlignment="Top" DataContext="{Binding Path=PanelVM1}"/>

困扰我的是,十次视图需要十次这个逻辑?

更新:回答一些问题:我想显示一个视图 10 次(在我的示例中),我通过从 UserControl 继承来定义自己的视图。所以我的vwPanel继承自UserControl.这10个vwPanel只是放置在网格内的StackPanel内。

正如您所指出的,这不是关于显示数据,列表视图或数据网格是更好的起点。这是一个特殊情况,我需要这么多输入控件:/

UPDATE2:我希望的更像是定义一个视图模型列表,并将我的 10 个视图绑定到其中一个列表。但这行不通,不是吗?至少我不知道如何引用 XAML 列表中的一个"特殊"整体......

将多个视图绑定到多个视图模型

通常我使用隐式DataTemplatesViews映射到ViewModels。它们可以进入 <Application.Resources><Window.Resources>甚至仅在特定元素下进入,例如<TabControl.Resources>

<DataTemplate DataType="{x:Type local:PanelViewModel}">
    <myControls:vwPanel />
</DataTemplate>

这意味着每当 WPF 在可视化树中遇到类型 PanelViewModel 的对象时,它将使用 vwPanel 绘制它

对象通常通过ItemsSource属性放置在VisualTree

<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" />

或使用ContentControl

<ContentControl Content="{Binding PanelVM1}" />

如果我正确理解你的问题,你有一个集合,你可以用视觉方式表示什么。也就是说,您有多个视图模型,要为其定义单个视图,但显示 X 次。您的示例显示您使用面板作为"面板视图模型"的视图...vwPanel 的父项控件是什么?假设您使用的是类似 ListBox 的东西,则可以定义一个包含 vwPanel 的自定义 DataTemplate,并将该 DataTemplate 分配给 ListBox.ItemTemplate。

例如:

<Window.Resources>
    <DataTemplate x:Key="myVMTemplate" TargetType="{x:Type myViewModels:PanelViewModel}">
        <myControls:vwPanel HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding Path=MyCollectionOfPanelVMs}" 
         ItemTemplate="{StaticResource myVMTemplate}" />

我还没有验证这是否有效。