Navigation场景下父ViewModel获取子Region用户输入的最优方案咨询
父ViewModel获取子Region内用户输入的推荐实现方案
以下是符合MVVM设计规范的几种主流实现方式,可根据业务场景选择:
- 事件聚合器(EventAggregator)方案
这是跨Region通信最常用的标准方案,适配大多数松散耦合的业务场景。
实现逻辑:先定义强类型的自定义事件及对应参数类,参数中声明所有需要传递的用户输入字段。子Region对应的ViewModel在用户完成输入、触发提交操作时,通过事件聚合器发布该事件。父ViewModel在初始化阶段订阅该事件,收到事件通知后即可直接从事件参数中读取所需的用户输入数据。
注意事项:父ViewModel销毁时需主动取消事件订阅,避免内存泄漏。
参考实现示例:// 自定义事件及参数 public class UserInputSubmittedEvent : PubSubEvent<UserInputDto> { } public class UserInputDto { public string UserName { get; set; } public int UserAge { get; set; } } // 子ViewModel发布事件 public ICommand SubmitCommand => new DelegateCommand(() => { var input = new UserInputDto { UserName = NameInput, UserAge = AgeInput }; _eventAggregator.GetEvent<UserInputSubmittedEvent>().Publish(input); }); // 父ViewModel订阅事件 public ParentViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; _eventAggregator.GetEvent<UserInputSubmittedEvent>().Subscribe(HandleInputData); } private void HandleInputData(UserInputDto input) { // 处理子Region返回的用户输入 ReceivedUserInput = input; } - 共享状态服务方案
适合需要父子端实时同步输入数据的场景。
实现逻辑:提前注册一个生命周期和父ViewModel一致的状态服务类,类中定义存储用户输入的对应属性(可实现INotifyPropertyChanged接口支持变更通知)。父ViewModel触发子Region导航时,将该服务实例作为导航参数传递给子ViewModel。子ViewModel将用户输入实时写入服务的属性中,父ViewModel可随时从服务中读取最新的输入数据,也可以监听服务的属性变更事件做实时响应。 - 导航回调委托方案
适合一次性传值、逻辑链路简单的场景,实现最简洁。
实现逻辑:父ViewModel触发导航时,将接收输入数据的回调委托(比如Action<UserInputDto>)作为导航参数传递给子ViewModel。子ViewModel在用户输入完成后,调用该回调委托,将输入数据作为参数传入即可。父ViewModel直接在回调的实现逻辑中处理返回的输入数据。
不推荐使用父ViewModel直接持有子ViewModel引用、遍历可视树读取UI控件值的实现方式,这两种方式会破坏MVVM的分层解耦设计,大幅提升后续维护成本。
内容的提问来源于stack exchange,提问作者Peter S.
相关产品推荐
相关产品推荐

