保持MVVM记住什么才是打开子窗口的正确方法(例如,修改主窗口上的选定项)?将复杂对象传递给子窗口
这是我有:MainWindow.xaml(在MainWindow.xaml.cs它分配MainVM作为自己的DataContext)
我也想有:ChildWindow.xaml和准系统ChildWindow.xaml.cs与ChildVM隐藏在控件之后。
所以,现在:
- 我怎么能弹出
ChildWindow
并传递一些对象Data
其ChildVM
? - 将结果(true/false)和结果数据(一些复杂的 对象)返回到
MainVM
? - 作为奖励,可以在
Data
的变化 的MainVM
,而他们在ChildVM
的工作?
这是我试过的 - 它并不能解决所有问题,但这是否正确?
- 对于(2),I创建的
Window
一个子类,称为DialogWindow
,其具有3个DependencyProperties:Data
(用于输入数据),ResultData
(输出数据)和ResultValue
(为一个布尔结果)。 ResultData
和ResultValue
均由的DialogWindow
的ChildVM
使用绑定集,并且当ResultValue
被设置时,DialogWindow
关闭。目前,
ChildWindow
从MainWindow.xaml.cs启动(所有意图和目的) - 有点不好。那么我可以通过一些输入数据,像这样:ChildDialogWindow w = new ChildDialogWindow();
w.Data = myDataObj;
所以,现在我需要有一个属性Data
上ChildVM,并在ChildDialogWindow.xaml.cs设置。再一次,使.xaml.cs更厚。
我认为,避免MainWindow.xaml.cs可能是一种更好的方法DialogService
作为依赖传递给MainVM
。但是,如何将值传递给ChildVM
?
[也许看看这个?](http://stackoverflow.com/a/16994523/1834662) – Viv
@Viv,这是不坏,但它采用的是框架,我希望避免。我想也许我可以解除Messenger的代码(除非它依赖于其他一些框架,比如SimpleIoC) –
为什么要避免使用框架?.net是一个框架,我们可以编写本机C代码并避免.net all-together :)如果你的目的是要“学习”它的功能,你可以随时获得它的源代码,看看它是如何实现的,并且自己做。 'SimpleIoC'只是一个非常简单的DI容器。如果你正在寻找广泛的功能,你会看Unity并分类。我只是为了“不依赖”而重新发明车轮。 – Viv