牢记MVVM,打开子窗口(例如,修改主窗口上的选定项目)的正确方法是什么?
这是我所拥有的:MainWindow.xaml(在MainWindow.xaml.cs中,它会将MainVM分配为其自己的DataContext)
我还希望拥有:ChildWindow.xaml和准系统ChildWindow.xaml.cs,并在控件后面带有ChildVM。
因此,现在:
ChildWindow
并将一些对象Data
传递给它ChildVM
? 对象)返回
MainVM
? Data
中的变化由
MainVM
处理,而由ChildVM
处理? 这是我尝试的方法-它不能解决所有问题,但这是否是正确的方向?
Window
的子类DialogWindow
,它具有3个DependencyProperties:Data
(用于输入数据),ResultData
(用于输出数据)和ResultValue
(用于 bool 结果)。 ResultData
和ResultValue
都使用Binding由ChildVM
的DialogWindow
设置,并且当设置ResultValue
时,DialogWindow
关闭。 ChildWindow
(出于所有意图和目的)-有点不好。然后,我可以传递一些输入数据,如下所示:ChildDialogWindow w = new ChildDialogWindow();
w.Data = myDataObj;
因此,现在我需要在ChildVM上拥有一个属性
Data
,并在ChildDialogWindow.xaml.cs中进行设置。再次,使.xaml.cs变厚。我认为,避免MainWindow.xaml.cs的更好方法可能是某种
DialogService
,它作为依赖项传递给MainVM
。但是,然后如何将值传递给ChildVM
呢?
最佳答案
试试这个。
制作一个DialogService.cs
public class DialogService
{
public void Show(FrameworkElement view, ChildViewModel ChildVM)
{
Window window = new Window();
window.Content = view;
window.DataContext = ChildVM;
// For closing this dialog using MVVM
ChildVM.RequestClose += delegate
{
window.Close();
};
window.Show();
}
}
现在在ChildVm类中,添加此
public ICommand CloseCommand
{
get
{
if (_closeCommand == null)
_closeCommand = new RelayCommand(param => this.OnRequestClose());
return _closeCommand;
}
}
public event EventHandler RequestClose;
void OnRequestClose()
{
EventHandler handler = this.RequestClose;
if (handler != null)
handler(this, EventArgs.Empty);
}
现在,以这种方式启动
public void OpenChildDailog()
{
DialogService service = new DialogService();
ChildViewModel childVM = new ChildViewModel();
childVM.Data = ; // Assign whatever you want
childVM.ResultData = ;
service.Show(new ChildView(), childVM);
// Now get the values when the child dailog get closed
var retVal = childVM.ResultValue;
}
关于wpf - 将复杂对象传递给子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763665/