MVVM模式中,BaseViewModel 的 IsBusy 属性的作用
在MVVM模式中,BaseViewModel 的 IsBusy 属性主要用于管理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,需确保通过Dispatcher或MainThread.BeginInvokeOnMainThread(Xamarin)更新UI属性。 -
异常处理
在try/catch/finally中确保IsBusy被正确重置,避免任务异常后界面“卡死”。
通过 IsBusy,MVVM模式实现了业务逻辑与UI状态的解耦,提升代码可维护性,同时增强用户体验。
MVVM模式中BaseViewModel的IsBusy属性解析

48

被折叠的 条评论
为什么被折叠?



