使用MVVM与Caliburn Micro实现对象属性绑定时FullName不显示问题
问题根因
你当前的绑定逻辑存在属性归属不匹配问题:
- 两个文本框绑定的是
Person(PersonModel实例)自带的FirstName/LastName属性,修改文本框内容时只会更新Person对象内部的属性值 - 你在视图模型中单独定义的
FirstName/LastName属性和Person对象的属性完全独立,没有任何关联,对应的私有字段_firstName、_lastName始终未被赋值 FullName基于视图模型自身的FirstName/LastName生成,自然返回空内容
修复方案(二选一即可)
方案1:将FullName属性下沉到PersonModel中(更符合分层规范)
如果FullName是人员的通用业务属性,直接在PersonModel类中定义该属性即可,同时要保证PersonModel实现了INotifyPropertyChanged接口:
// PersonModel类内部代码 public string FirstName { get { return _firstName; } set { _firstName = value; NotifyOfPropertyChange(() => FirstName); NotifyOfPropertyChange(() => FullName); } } public string LastName { get { return _lastName; } set { _lastName = value; NotifyOfPropertyChange(() => LastName); NotifyOfPropertyChange(() => FullName); } } public string FullName => $"{FirstName} {LastName}";
修改视图中FullName的绑定表达式:{Binding Path = Person.FullName, Mode=OneWay}
方案2:让视图模型的属性代理Person对象的属性
如果FullName是视图专属的展示属性,可以修改视图模型的FirstName/LastName逻辑,直接关联Person对象的属性:
// 移除视图模型中独立的_firstName、_lastName字段 public string FirstName { get { return Person?.FirstName; } set { if (Person != null) Person.FirstName = value; NotifyOfPropertyChange(() => FirstName); NotifyOfPropertyChange(() => FullName); } } public string LastName { get { return Person?.LastName; } set { if (Person != null) Person.LastName = value; NotifyOfPropertyChange(() => LastName); NotifyOfPropertyChange(() => FullName); } } // 同时在Person的set方法中补充相关属性的变更通知 public PersonModel Person { get { return _person; } set { _person = value; NotifyOfPropertyChange(() => Person); NotifyOfPropertyChange(() => FirstName); NotifyOfPropertyChange(() => LastName); NotifyOfPropertyChange(() => FullName); } }
该方案下需要把视图中两个文本框的绑定从Person.FirstName、Person.LastName改为FirstName、LastName,直接绑定视图模型的属性即可。
内容的提问来源于stack exchange,提问作者Sajju Thambi
相关产品推荐
相关产品推荐

