5

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

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

那么如何将这些 View 绑定到 ViewModel 呢?

我考虑在“更高级别”的 ViewModel 中有 10 个 ViewModel 实例,并给视图修复定义 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 只是放置在 Grid 内的 StackPanel 内。

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

UPDATE2:我所希望的更像是定义一个 ViewModel 列表并将我的 10 个视图绑定到这个列表之一。但这行不通吗?至少我不知道如何在 XAML 列表中引用一个“特殊”实体......

4

2 回答 2

8

通常我使用隐式DataTemplates映射ViewsViewModels. 它们可以进入<Application.Resources><Window.Resources>甚至只能在特定元素下进入,例如<TabControl.Resources>

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

这意味着每当 WPF 在类型的 VisualTree 中遇到对象时PanelViewModel,它将使用vwPanel

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

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

或通过使用ContentControl

<ContentControl Content="{Binding PanelVM1}" />
于 2012-06-15T14:01:01.473 回答
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}" />

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

于 2012-06-15T13:59:47.390 回答