You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于条件阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:42:32