如何基于条件阻止Community Toolkit属性被修改
解决Community Toolkit ObservableProperty近似相等判断阻止属性更新问题
问题核心:OnHeightChanging方法无法阻止属性赋值,因为Community Toolkit生成的setter逻辑是先调用OnChanging,再强制设置字段值,返回操作不会中断后续流程。
正确实现方式
放弃自动生成的属性,手动实现属性并结合ObservableObject的SetProperty方法,同时加入近似相等判断,既保留MVVM Toolkit的通知能力,又实现需求:
private double _height; public double Height { get => _height; set { // 先判断新老值是否近似相同,相同则直接返回 if (IsValueApproxSame(value, _height)) return; // SetProperty会自动处理值变化通知,返回值表示是否实际修改了属性 if (SetProperty(ref _height, value)) { // 仅当属性确实更新时发送消息 _messenger.Send(new ContainerElementActualSizeChanged(ElementId)); } } }
为什么原写法无效?
你使用的OnHeightChanging是MVVM Toolkit生成的钩子方法,它的执行时机是在字段赋值之前,但生成的setter逻辑没有预留取消赋值的入口,伪代码逻辑如下:
public double Height { get => height; set { double oldValue = height; OnHeightChanging(oldValue, value); // 不管OnHeightChanging做了什么,都会执行赋值 height = value; OnHeightChanged(oldValue, value); } }
所以即使你在OnHeightChanging里返回,后续的赋值操作依然会执行,导致属性被更新。
内容的提问来源于stack exchange,提问作者Laxmi
相关产品推荐
相关产品推荐

