c# - 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。
解决方案
可以吗,还是有我不知道的更好的解决方案?
是的,如果您不希望视图模型之间有任何连接,则可以使用事件聚合器。
另一种选择是让视图共享一个共同的DataContext
. MyWindowModel
例如,可以公开窗口中绑定到的CustomControlModel
属性CustomControl
。
MyWindowModel
然后可以在仍然绑定到时CustomControlModel
直接访问 的任何属性。但是,这确实会在和之间创建依赖关系。CustomControl
CustomControlModel
MyWindowModel
CustomControlModel
推荐阅读
- algorithm - 更有效地找到差异较小的最大区域
- groovy - Spock 断言函数调用
- kubernetes - 在 pod 中同步数据
- c# - NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询
- json - 如何使用 jq 或任何工具合并目录中的多个 json 文件?
- plot - geopandas plotting - 识别地图之外的位置
- python - 在为 pip 安装安装不同的缓存后,Docker 实验构建仍然使用系统缓存
- angular - Angular 使用路径变量从 API 获取数据
- python - 为什么 mne resample 方法不会对数据进行点对点采样?
- python - 为 macOS 下的 ctypes.util.find_library() 指定路径