对话框的通用视图-可以是窗口,也可以是自定义的“模式”覆盖类型控件。它的核心是一个内容显示器,我们将视图模型转储到其中,它处理关闭窗口的连接——例如,在数据上下文更改时,您可以检查新的 ViewModel 是否继承自您的基类,如果是,订阅相关的关闭事件(处理程序将分配对话框结果)。如果您提供了替代的通用关闭功能(例如 X 按钮) ,那么您应该确保在 ViewModel 上也运行相关的 close 命令。
ButtonClickHandler(sender, args){
var vm = DataContext as ISomeDialogProvider; // check for null
var ui_vm = new ViewModelContainer();
// assign margin, width, or anything else that your custom dialog might require
...
ui_vm.ViewModel = vm.SomeDialogViewModel; // or .GetSomeDialogViewModel()
// raise the dialog show event
}
// in code behind
var result = somedialog.ShowDialog();
if (result == ...
我用:
// in view model
var vm = new SomeDialogViewModel(); // child view model
vm.CommitAction = delegate { this.DoSomething(vm); } // what happens on commit
vm.CancelAction = delegate { this.DoNothing(vm); } // what happens on cancel/close (optional)
// raise dialog request event on the container