MAUI中实现MVVM模式需分离View、ViewModel、Model三层,依靠BindingContext绑定、INotifyPropertyChanged通知和ICommand命令驱动交互。View层在XAML中绑定ViewModel属性与命令;ViewModel层实现属性变更通知及命令逻辑;Model层按需定义纯数据类。

MAUI 中实现 MVVM 模式,核心是分离界面(View)、业务逻辑(ViewModel)和数据(Model),靠绑定(Binding)和命令(Command)驱动交互。不依赖第三方框架也能实现,但推荐用 .NET 内置的 INotifyPropertyChanged 和 ICommand,再配合 MAUI 的 BindingContext 就能跑起来。
View 层:XAML 页面绑定 ViewModel
在页面(如 MainPage.xaml)里,把 BindingContext 指向 ViewModel 实例。最常用方式是在构造函数中设置:
public MainPage()
{
InitializeComponent();
BindingContext = new MainViewModel(); // 关键:绑定 ViewModel
}然后在 XAML 里用 {Binding} 绑定属性或命令:
ViewModel 层:实现 INotifyPropertyChanged + ICommand
ViewModel 是普通 C# 类,需通知界面属性变化,并提供可执行的命令。基础写法如下:
public class MainViewModel : INotifyPropertyChanged
{
private string _welcomeText = "欢迎使用 MAUI MVVM";
public string WelcomeText
{
get => _welcomeText;
set
{
_welcomeText = value;
OnPropertyChanged(); // 触发界面刷新
}
}
public ICommand ClickCommand { get; }
public MainViewModel()
{
ClickCommand = new Command(OnClicked);
}
private void OnClicked()
{
WelcomeText = "按钮被点击了!";
}
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}}
Model 层(按需):专注数据结构
Model 不强制要求,但建议把纯数据类(比如用户、订单)单独抽出来,不带逻辑也不实现通知接口:
- 例如
User.cs只含Id、Name等自动属性 - ViewModel 中可持有
User实例,或通过属性暴露它(并确保该属性变更时触发通知) - 如果 Model 本身需要响应式更新(比如实时编辑字段),才让它也实现
INotifyPropertyChanged
进阶提示:避免常见坑
- 别在 ViewModel 构造函数里直接调用耗时操作(如网络请求),建议配合
Task.Run或用异步命令(IAsyncCommand,可用 CommunityToolkit.Mvvm 扩展) - BindingContext 赋值必须在
InitializeComponent()之后,否则绑定无效 - 命令执行后若要更新 UI,确保修改的是已绑定的属性(且正确触发
OnPropertyChanged) - 调试时可在属性 setter 打断点,确认是否被调用;也可开启 MAUI 绑定日志:
MauiProgram.CreateBuilder().ConfigureLogging(b => b.AddConsole());
基本上就这些。MAUI MVVM 不复杂但容易忽略通知机制和绑定时机。写熟了以后,加新页面基本就是复制粘贴 View + 新建 ViewModel + 绑定属性三步走。










