Xamarin Forms中BaseViewModel子类调用方法后属性为null绑定异常
问题分析与解决方案
核心问题
你的代码存在两个关键问题:
- 子类代码结构错误:
ChildViewModel中直接在类定义层级调用CallTest()和赋值returnedString是C#语法不允许的,这类执行语句必须放在构造函数、方法或属性访问器内部。 - 基类属性赋值逻辑可能失效:代码中写的
setproprty是拼写错误,若实际的属性更新方法未正确实现,会导致私有字段_test无法被赋值。
修复步骤
1. 完善基类的属性更新逻辑
确保BaseViewModel正确实现INotifyPropertyChanged接口的通知逻辑,同时修正拼写错误:
public class BaseViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _test; public string Test { get { return _test; } set { SetProperty(ref _test, value); } } // 通用属性更新方法,实现通知逻辑 protected void SetProperty<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null) { if (!EqualityComparer<T>.Default.Equals(backingField, value)) { backingField = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public void CallTest() { Test = "This is string data"; } }
2. 修正子类的代码执行位置
将CallTest()调用和字段赋值移到子类的构造函数(或目标方法)中:
public class ChildViewModel : BaseViewModel { private string _returnedString; public ChildViewModel() { CallTest(); _returnedString = Test; // 此时Test会正确获取到赋值后的内容 } // 可选:若需外部访问该值,可暴露为属性 public string ReturnedString => _returnedString; }
额外说明
如果你的逻辑不是在初始化时执行,只需将CallTest()和赋值语句移到对应的业务方法内即可,核心是保证代码在合法的执行上下文(构造函数/方法)中运行。
内容的提问来源于stack exchange,提问作者srdpnr
相关产品推荐
相关产品推荐

