MVVMCross中Model属性变更为何无法触发ViewModel对应属性set方法
问题解答
核心误解澄清
你当前的认知存在一个关键偏差:Model的oc属性变更时,只会通知「该WallModel实例自身的oc属性发生了变化」,完全不会触发ViewModel中wallModel属性的set方法。wallModel属性的set方法仅在你给它赋值新的WallModel对象实例时才会执行,修改实例内部的属性不会改变wallModel存储的对象引用,自然不会走set逻辑。
RaisePropertyChanged(() => oc)的实际作用
这个方法是INotifyPropertyChanged接口的配套实现,作用只有一个:向所有订阅了当前对象PropertyChanged事件的接收方,发送「指定名称的属性已变更」的通知,不会跨对象自动触发其他无关属性的赋值逻辑。
现有架构调整方案
你当前的Model和ViewModel的基础定义没有问题,根据你的实际需求可以选择两种处理方式:
方案1:仅需要View层同步显示oc的最新值
不需要修改任何C#代码,MvvmCross的绑定原生支持子属性路径绑定,你直接在View的绑定表达式中写wallModel.oc即可,绑定引擎会自动监听WallModel实例的属性变更事件,oc值变化时View会自动更新。
方案2:需要ViewModel在oc变更时执行额外业务逻辑
你需要手动订阅WallModel实例的PropertyChanged事件,示例代码如下:
using System.ComponentModel; public class YourViewModel : MvxViewModel { private WallModel _wallModel = new WallModel(); public WallModel wallModel { get => _wallModel; set { // 取消旧实例的事件订阅,避免内存泄漏 if (_wallModel != null) { _wallModel.PropertyChanged -= OnWallModelPropertyChanged; } SetProperty(ref _wallModel, value); // 订阅新实例的属性变更事件 if (_wallModel != null) { _wallModel.PropertyChanged += OnWallModelPropertyChanged; } } } public YourViewModel() { // 初始实例不走set,需要手动订阅 _wallModel.PropertyChanged += OnWallModelPropertyChanged; } private void OnWallModelPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(WallModel.oc)) { // 此处编写oc变更后需要执行的业务逻辑 // 如果需要将oc同步到ViewModel的独立属性,可在此处触发属性变更通知 // 例:RaisePropertyChanged(nameof(ViewModelOcProperty)); } } // ViewModel销毁时取消订阅,避免内存泄漏 protected override void Dispose(bool isDisposing) { if (isDisposing && _wallModel != null) { _wallModel.PropertyChanged -= OnWallModelPropertyChanged; } base.Dispose(isDisposing); } }
内容的提问来源于stack exchange,提问作者Zore69
相关产品推荐
相关产品推荐

