当前位置: 首页 > 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状态的解耦,提升代码可维护性,同时增强用户体验。

http://www.xdnf.cn/news/1039645.html

相关文章:

  • Hexo-butterfly友情链接页面优化
  • 【Linux】进程优先级和切换调度
  • 【软测】脚本实现 - 网页自动化测试
  • linux-压缩类命令
  • 黑马教程强化day3-1
  • 2025虚幻引擎一般用什么模型格式
  • 【Linux系统编程】线程概念
  • 洛谷 P5716:月份天数 ← 闰年判断
  • leetcode_128 最长连续序列
  • stm32传感器通用驱动代码
  • 技术实录-从 MySQL 启动失败到大小写兼容恢复:一次完整故障排查复盘20250614
  • HEAD ` 只返回响应头(Headers),不返回正文内容(Body)
  • OD 算法题 B卷【路灯照明II】
  • C++如何自己实现一个shared_ptr
  • Flutter网络请求完全指南:http与Dio库深度解析
  • 如何安全高效地维护CMS智能插件?
  • JavaScript基础-DOM事件流
  • 零基础入门PCB设计 一实践项目篇 第二章(开发板电源设计)
  • 力扣Hot100每日N题(15~16)
  • 基于docker技术的单主机环境模拟测试批量客户端
  • Vue3 响应式翻牌抽奖游戏
  • 【系统分析师】第5章-基础知识:数据库系统(核心总结)
  • 并行编程实战——CUDA编程介绍
  • 嵌入式PADS中生产资料导出操作与实现
  • NCNN 模型文件的生成流程详解
  • 鸿蒙系统备份恢复
  • 【0.4 漫画计算机网络基础】
  • 思科资料-ACL的基础配置-详细总结
  • UGPCL
  • 德国马克斯·普朗克数学研究所:几何朗兰兹猜想