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
Wpf 如何从一个视图传递集合';将视图模型转换为另一个视图?_Wpf_Mvvm - Fatal编程技术网

Wpf 如何从一个视图传递集合';将视图模型转换为另一个视图?

Wpf 如何从一个视图传递集合';将视图模型转换为另一个视图?,wpf,mvvm,Wpf,Mvvm,在以下情况下,任何人都可以提出解决方案: 我有一个MVVM应用程序,其中我需要从主窗口显示模式窗口,以便为viewModel类中的集合添加一些值。最好的方法是什么。我是说。我需要更改viewModel中的一些集合,我的主窗口引用了viewMode viewModel = new ExamViewModel(); this.DataContext = viewModel; 将viewmodel也暴露给子窗口是否足够好?或者有一种“正确”的方法可以做到这一点。通常情况下,模式窗口只知道有问题的

在以下情况下,任何人都可以提出解决方案:

我有一个MVVM应用程序,其中我需要从主窗口显示模式窗口,以便为viewModel类中的集合添加一些值。最好的方法是什么。我是说。我需要更改viewModel中的一些集合,我的主窗口引用了viewMode

 viewModel = new ExamViewModel();
 this.DataContext = viewModel;

将viewmodel也暴露给子窗口是否足够好?或者有一种“正确”的方法可以做到这一点。

通常情况下,模式窗口只知道有问题的对象,允许用户填写新对象(也可能编辑现有对象)。然后,它会将填充的对象传递回负责更新集合的父对象。

正如@Marcelo所建议的,打开新子窗口的代码应该与ViewModel中的某个委托一起传递。此委托将创建一个子视图模型(例如
ChildVM
),并使用其自己的集合(
ParentVM.ParentCollection
)填充其一个属性(例如
ChildCollection

然后,您的子窗口将绑定到新填充的集合(ChildVM.ChildCollection)属性,并在执行“确定”/“保存”类确认操作后,关闭的子窗口应通知/委托回父viewmodel,以将更改“合并”回其旧集合。。。就像这样

   parentVM.ParentCollection.Clear(); 
   parentVM.ParentCollection.AddRange(ChildVM.ChildCollection);
这边

  • 更改在单独的列表上完成。保持数据完整性
  • 只有合法操作(确定/保存)合并更改
  • 由于断开连接的数据和未加载的子视图,子视图模型很容易从UI上断开连接并释放内存
  •    parentVM.ParentCollection.Clear(); 
       parentVM.ParentCollection.AddRange(ChildVM.ChildCollection);