当前位置: 首页 > news >正文

MVVM模式中,BaseViewModel 的 IsBusy 属性的作用

MVVM模式中,BaseViewModel 的 IsBusy 属性的作用

在MVVM模式中,BaseViewModelIsBusy 属性主要用于管理ViewModel的异步操作状态,确保界面与后台任务的协调。以下是其核心用途和实现细节:


1. 核心作用

  • 防止重复操作
    当异步任务(如网络请求、数据库查询)执行时,将 IsBusy 设为 true,禁用按钮或控件,避免用户重复触发。

  • UI状态反馈
    在界面显示加载动画(如旋转图标、进度条),提示用户操作正在进行中。

  • 统一状态管理
    作为基类属性,所有继承的ViewModel均可复用,减少重复代码。


2. 典型使用场景

// 在 BaseViewModel 中定义
public class BaseViewModel : INotifyPropertyChanged 
{private bool _isBusy;public bool IsBusy {get => _isBusy;set {_isBusy = value;OnPropertyChanged();// 触发命令可执行性更新(如按钮禁用)OnPropertyChanged(nameof(IsNotBusy)); }}// 方便绑定反向逻辑(如按钮的 IsEnabled)public bool IsNotBusy => !IsBusy;public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged([CallerMemberName] string name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
  • 绑定到界面控件

    <Button Text="加载数据" Command="{Binding LoadDataCommand}" IsEnabled="{Binding IsNotBusy}"/>
    <ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="True"/>
    
  • 异步操作中的状态管理

    public class UserViewModel : BaseViewModel 
    {public ICommand LoadDataCommand => new Command(async () => {if (IsBusy) return; // 防止重复执行IsBusy = true;try {await LoadDataAsync(); // 异步任务}finally {IsBusy = false; // 确保状态重置}});
    }
    

3. 高级优化

  • 计数器模式
    处理多个并发任务时,使用计数器代替布尔值:

    private int _busyCounter;
    public bool IsBusy 
    {get => _busyCounter > 0;set {_busyCounter = Math.Max(0, value ? _busyCounter + 1 : _busyCounter - 1);OnPropertyChanged();}
    }
    
  • 附加状态信息
    扩展 BusyMessage 属性,提供更详细的提示:

    private string _busyMessage;
    public string BusyMessage 
    {get => _busyMessage;set {_busyMessage = value;OnPropertyChanged();}
    }// 使用时:
    IsBusy = true;
    BusyMessage = "正在加载用户数据...";
    

4. 注意事项

  • 线程安全
    异步操作可能在其他线程修改 IsBusy,需确保通过 DispatcherMainThread.BeginInvokeOnMainThread(Xamarin)更新UI属性。

  • 异常处理
    try/catch/finally 中确保 IsBusy 被正确重置,避免任务异常后界面“卡死”。


通过 IsBusy,MVVM模式实现了业务逻辑与UI状态的解耦,提升代码可维护性,同时增强用户体验。

相关文章:

  • 矩阵混剪系统源码搭建全流程技术解析,矩阵OEM
  • LeetCode 第74题:搜索二维矩阵
  • 动态多目标进化算法:基于迁移学习的动态多目标粒子群优化算法(TrMOPSO)求解IEEE CEC 2015,提供完整MATLAB代码
  • MATLAB提供的两种画误差矩阵的函数
  • 【MATLAB例程】追踪法制导的程序,适用于三维平面,目标是运动的,带绘图和捕获时间|附下载链接
  • 经典蓝牙 vs BLE:10 大核心差异深度对比(附高频考点 + 大厂真题)
  • 基于docker技术的单主机环境模拟测试批量客户端
  • 软件测试质量的“防”与“治”
  • 【0.1 漫画计算机组成原理】
  • PCB设计教程【大师篇】stm32开发板PCB布线(信号部分)
  • langchain从入门到精通(六)——LCEL 表达式与 Runnable 可运行协议
  • 同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——B
  • 出现端口占用,关闭端口进程命令
  • LeetCode 第73题:矩阵置零
  • EngineAI 1. Start/Resume Training
  • 1.1 Linux 编译FFmpeg 4.4.1
  • Git详解:初学者完全指南
  • Git 工作流与版本管理策略
  • 日本生活:日语语言学校-日语作文-沟通无国界(1)-题目:假装写日记
  • YOLOv8分类的三种C++实现:opencv dnn/libtorch/onnxruntime
  • 个人网站 怎么备案/郴州seo外包
  • wordpress免费创建博客/seo文章生成器
  • 施工员证书查询网站/武汉seo搜索引擎优化
  • 织梦网站模板下载/名风seo软件
  • 安庆市住房和城乡建设局网站首页/广告联盟平台哪个好
  • 建设母婴网站的目的/站长工具是什么意思