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

Xamarin.Forms+FreshMVVM场景下如何为FreshBasePageModel新增IsBusy属性

FreshBasePageModel扩展IsBusy属性的实现方案

你提到的自定义中间基类的方案已经是FreshMVVM生态下的标准实践,是生产环境的首选方案,不存在不够优雅的问题,可选的实现方案如下:

1. 自定义中间基类(推荐)

这是官方推荐的扩展方式,实现成本低,后续可扩展空间大,除了IsBusy属性外,还可以统一添加全局错误处理、公共页面跳转逻辑、生命周期通用回调等能力。
实现示例:

public class FreshBasePageModelExt : FreshBasePageModel
{
    private bool _isBusy;
    public bool IsBusy
    {
        get => _isBusy;
        set 
        {
            _isBusy = value;
            RaisePropertyChanged();
            // 可扩展全局通用逻辑,例:IsBusy状态变化时自动控制工具栏可用性
            CoreMethods.ToolbarIsEnabled = !value;
        }
    }

    // 配套封装快捷执行方法,避免重复写try/finally逻辑
    protected async Task RunBusyTask(Func<Task> taskAction)
    {
        if (IsBusy) return;
        try
        {
            IsBusy = true;
            await taskAction.Invoke();
        }
        finally
        {
            IsBusy = false;
        }
    }
}

改造时只需要IDE全局替换所有PageModel的基类引用,从FreshBasePageModel改为FreshBasePageModelExt即可,全程无侵入性,后续维护成本极低。

2. 标记接口+默认实现(适合不想修改原有基类引用的场景)

如果使用的.NET版本支持C# 8及以上,可以通过默认接口方法+关联存储实现扩展属性,不需要修改现有基类继承关系:

public interface IHasIsBusy : INotifyPropertyChanged
{
    private static readonly ConditionalWeakTable<IHasIsBusy, StrongBox<bool>> _isBusyStore = new();

    public bool IsBusy
    {
        get => _isBusyStore.GetOrCreateValue(this).Value;
        set
        {
            _isBusyStore.GetOrCreateValue(this).Value = value;
            OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsBusy)));
        }
    }
}

只需要给需要IsBusy属性的PageModel添加IHasIsBusy接口声明即可,不需要额外写实现代码。该方案缺点是属性读写性能略低于直接定义属性,且无法直接访问FreshBasePageModel的内置成员,适合小型项目快速改造使用。

内容的提问来源于stack exchange,提问作者Remin Maxim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:06:04