首页 > 解决方案 > Window 和 CustomControl 之间的事件

问题描述

我需要对以下问题提出建议:我有一个带有文本框、CustomControl 和 2 个按钮的窗口。一种用于保存用户输入的数据。

因此,如果您从实现方面看:

MyWindow : IWindow --- DataContext is ---> MyWindowModel : BaseViewModel --- contains ---> Commands : DelegateCommands

CustomControl : IControl --- DataContext is ---> CustomControlModel : BaseViewModel --- contains ---> Datagrid and SelectedItem

当用户更改 UserControl 的 DataGrid 中的选择时,控件中的属性会更新。到目前为止一切顺利,这里没有问题。

但是 Window 或者更准确地说是 Window 中的 DataContext 模型,会检查用户是否从 DataGrid 中选择了某些内容并在 Textbox 中正确输入了数据

// First parameter is the Action, second is the ICommandOnCanExecute
CmdSave = new DelegateCommands(SaveAction, IsSavable);

IsSavable 代码:

public bool IsSavable(object parameter) {
    var result = Validator.Validate(this, ruleSet: "IsSavable");
    return Validator.Validate(this, ruleSet: "IsSavable").IsValid;
}

验证器可以访问 MyWindowModel 的属性以进行检查,并且模型需要选定的项目以进行稍后的保存操作。

现在这两个模型之间没有联系,我不希望它们相互依赖。

我的解决方案是实现一个 EventSystem。当 CustomControl 注册更改时,它将通过 EventSystem 将其发送给每个订阅者,并且 Window 只需要将 CustomControl 事件订阅到他的 DataContext 模型。

可以吗,还是有我不知道的更好的解决方案?

编辑:使用 Prism.Core 和事件聚合器就像一个魅力。如果有人需要如何做,请使用 Prism。

标签: c#.netwpfmvvm

解决方案


可以吗,还是有我不知道的更好的解决方案?

是的,如果您不希望视图模型之间有任何连接,则可以使用事件聚合器。

另一种选择是让视图共享一个共同的DataContext. MyWindowModel例如,可以公开窗口中绑定到的CustomControlModel属性CustomControl

MyWindowModel然后可以在仍然绑定到时CustomControlModel直接访问 的任何属性。但是,这确实会在和之间创建依赖关系。CustomControlCustomControlModelMyWindowModelCustomControlModel


推荐阅读