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
相关产品推荐
相关产品推荐

