Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个视图绑定到多个视图模型_C#_Wpf_User Interface_Mvvm - Fatal编程技术网

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

C# 将多个视图绑定到多个视图模型,c#,wpf,user-interface,mvvm,C#,Wpf,User Interface,Mvvm,我有一个WPF窗口,显示不同的自定义视图。到目前为止,我能够使用我学到的关于MVVM的所有知识:) 现在我遇到了一个新的“问题”:在更大的视图中,我有10个相同视图的实体。这十个视图实体包含一组控件(文本框、组合框等),但都是一致的 那么如何将这些视图绑定到ViewModel 我考虑在“更高级别”的ViewModel中有10个ViewModel实例,并给出视图修复,将VM实例定义为datacontext 我现在的问题是-->是否有更简单(或更方便)的方法将多个(相同)视图绑定到它们的ViewMo

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

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

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

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

我现在的问题是-->是否有更简单(或更方便)的方法将多个(相同)视图绑定到它们的ViewModel

代码示例:

视图模型:

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个面板正好放置在网格内的StackPanel中

正如您所指出的,这与显示数据无关,最好从listview或datagrid开始。这是我需要这么多输入控件的特殊情况:/


更新2:我希望的更像是定义一个ViewModels列表,并将我的10个视图绑定到这个列表中的一个。但这行不通,不是吗?至少我不知道如何从XAML中引用列表中的一个“特殊”实体…

如果我正确理解了您的问题,您就有一个集合,可以直观地表示您想要表示的内容。也就是说,您有多个要为其定义单个视图的视图模型,但显示X次。您的示例显示了使用面板作为“PanelViewModel”的视图……父项对面板的控件是什么?假设您使用的是类似ListBox的东西,您可以定义包含vwPanel的自定义数据模板,并将该数据模板分配给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}" />


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

通常我使用隐式
数据模板
视图
映射到
视图模型
。它们可以放在
中,甚至可以放在特定元素下,例如

或者使用
ContentControl

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


大视图中的十个视图是专门定义的吗?换句话说,有什么原因不能创建一个列表并将该列表绑定到ViewModels的IEnumerable并以这种方式显示它们吗?@Tim我需要它们以正确的顺序进行输入和输出。如果没有特别定义,这可能吗?但我还能“识别”这些吗?我的意思是,在MVVM中,您的顺序是V->VM->M。我的视图是否知道使用您的解决方案的正确VM?特别是如果VM中的属性被更高级别的VM?@chiffre更改,则VM在itemsControl中显示的顺序与它们添加到ItemsSource集合的顺序完全相同。因此,使用Rachel的示例,如果将3个ViewModel添加到“面板”,它们将按添加顺序显示。选择第一个并更改其属性时,面板索引0中的viewmodel将更改该属性。至于在您的高级VM更改另一个VM时通知视图,只要您的VM正确实现INotifyPropertyChanged,您就可以了。@chiffre我不能100%肯定我理解您的问题。据我所知,您的虚拟机包含10个
PanelViewModel
属性,您希望使用完全相同的
Panel
UserControl来显示这些属性。根据面板在VM中的列出方式,您可以使用
ItemsControl
(如果它们存储在
ObservableCollection
中)或
ContentControl
(如果它们存储在10个单独的属性中)来显示它们。
PanelUserControl
后面的
DataContext
将是它绑定到的任何
PanelViewModel
,因此,是的,当由父VMNow更新时,它们将显示正确的数据。我想我明白你的意思了!这实际上是可行的——我稍后会尝试使用不同的ItemControls等,因为我需要让它们自动折叠等等。所以我必须弄清楚该用什么。非常感谢!!
<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" />
<ContentControl Content="{Binding PanelVM1}" />