Xamarin开发中为何需在所有属性中使用SetProperty?
关于Xamarin ViewModel中SetProperty的常见问题解答
1. SetProperty的作用是什么?
你猜的没错,这确实和XAML绑定的UI更新直接相关。SetProperty是MVVM框架(比如Xamarin.Forms自带的BindableBase,或是Prism、MvvmCross这类第三方框架)封装的方法,核心是帮你实现INotifyPropertyChanged接口的逻辑:
- 先对比属性新值和旧私有字段的值,仅当两者不同时才执行后续操作(避免无意义的更新);
- 更新私有字段的数值;
- 触发
PropertyChanged事件,通知绑定该属性的XAML视图控件:“属性值已变更,请刷新显示内容”。
举个实际场景:把Label的Text绑定到ViewModel的MyProperty,当你在ViewModel里修改MyProperty的值时,SetProperty会自动告知Label更新显示的文字。
2. 是否所有属性都需要这么做?
不需要。只有和XAML视图绑定、值变化需要同步到UI的属性才需要用这种写法。如果是ViewModel内部自用、不需要和UI交互的属性(比如临时计算的中间值、仅在逻辑里传递的参数),直接用自动属性public string MyProperty { get; set; }完全没问题,没必要额外写私有字段和调用SetProperty。
3. 使用自动属性会有什么后果?
如果这个属性是和UI绑定的,修改属性值时因为没有触发PropertyChanged事件,绑定的UI控件不会自动更新。比如:
- 给Label的
Text绑定了自动属性MyProperty; - 在ViewModel里执行
MyProperty = "新内容"; - 界面上的Label文字还是原来的内容,不会变成“新内容”——除非手动刷新整个页面或控件,但这违背了MVVM数据驱动UI的设计思路,会导致UI和数据状态不同步。
写法对比
需要绑定UI的属性(正确写法):
private string _myProperty; public string MyProperty { get { return _myProperty; } set { SetProperty(ref _myProperty, value); } }
仅内部使用的属性(合理写法):
public string TempCalculationValue { get; set; }
内容的提问来源于stack exchange,提问作者Nacht
相关产品推荐
相关产品推荐

