Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net 将窗口绑定到父窗口的子集合_.net_Wpf_Mvvm - Fatal编程技术网

.net 将窗口绑定到父窗口的子集合

.net 将窗口绑定到父窗口的子集合,.net,wpf,mvvm,.net,Wpf,Mvvm,我在WPF中使用MVVM模型时遇到了一个问题。以下是我的物品: 视图 主窗口(视图) (此视图的DataContext绑定到MainWindowViewModel) 项目视图窗口 (此的DataContext绑定ItemListViewModel) 查看模型 主窗口视图模型 (包括: 可观察收集项目) ItemListViewModel (包括: 可观察到的收集项目, ItemViewModel SelectedItem, 其他属性/命令) ItemViewWindow可通过主窗口上的菜

我在WPF中使用MVVM模型时遇到了一个问题。以下是我的物品:

视图

  • 主窗口(视图) (此视图的DataContext绑定到MainWindowViewModel)

  • 项目视图窗口 (此的DataContext绑定ItemListViewModel)

查看模型

  • 主窗口视图模型 (包括: 可观察收集项目)

  • ItemListViewModel (包括: 可观察到的收集项目, ItemViewModel SelectedItem, 其他属性/命令)

ItemViewWindow可通过主窗口上的菜单按钮访问。我希望能够仅将集合从主窗口传递到ItemView(注意:我无法将其设置为DataContext,因为它需要ItemListViewModel)。然后,在那里所做的任何更改都应该反映在主窗口中

我知道一种方法是将ItemListViewModel作为MainWindowViewModel的属性而不是集合,然后我可以将其作为DataContext传递,但在MainWindowViewModel中使用ItemListViewModel的额外功能似乎是错误的。有没有一种更优雅的方法可以做到这一点而不必使用背后的UI代码?

为什么不:

答:使ItemListViewModel公开您为其分配集合的属性,例如

class ItemListViewModel 
{
    public SomeCollectionType TheCollection { get; set; } // most likely you have INotifyPropertyChanged etc so probably more to it than get/set
}
然后在MainWindowViewModel中实例化ItemVM时设置它

public void OpenItemList() 
{
    var itemList = new ItemListViewModel();
    itemList.TheCollection = CollectionFromThisVM;
    // etc
}
或者

b:使用类似于
EventAggregator
模式的方式发布包含ItemListViewModel要订阅的集合的消息


第一种方法似乎更简单

我一直在做类似于(a)的事情,但我并不真的喜欢将数据/上下文更改为代码隐藏中的内容-我现在就用它。(b) 是一种选择,但如果可能的话,我想尽量避免。我会把这个开久一点。