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

时间:2012-06-15 13:49:07

标签: c# wpf user-interface mvvm

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

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

那么如何将这些视图绑定到ViewModel?

我考虑过在“更高级别”的ViewModel中有10个ViewModel实例,并将视图修复定义为VM的实例作为datacontext。

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

代码示例:

查看型号:

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只是放在Grid内的StackPanel内。

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

UPDATE2:我希望的更像是定义ViewModel列表并将我的10个视图绑定到此列表中的一个。但这不会起作用吗?至少我不知道如何在XAML列表中引用一个“特殊”权利......

2 个答案:

答案 0 :(得分:8)

通常我使用隐式DataTemplatesViews映射到ViewModels。他们可以进入<Application.Resources><Window.Resources>,甚至可以进入<TabControl.Resources>

等特定元素
<DataTemplate DataType="{x:Type local:PanelViewModel}">
    <myControls:vwPanel />
</DataTemplate>

这意味着只要WPF遇到类型为PanelViewModel的VisualTree中的对象,它就会使用vwPanel

绘制它

对象通常通过VisualTree属性

放置在ItemsSource
<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" />

或使用ContentControl

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

答案 1 :(得分:1)

如果我正确地理解了您的问题,那么您可以收集一些可以直观表达的内容。也就是说,您有几个要为其定义单个视图的视图模型,但显示X次。您的示例显示您使用面板作为“PanelViewModel”的视图...什么是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}" />

我还没有证实这是有效的。