MAUI MVVM模式怎么实现 C# MAUI MVVM基础教程

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

MAUI 中实现 MVVM 模式,核心是分离界面(View)、业务逻辑(ViewModel)和数据(Model),靠绑定(Binding)和命令(Command)驱动交互。不依赖第三方框架也能实现,但推荐用 .NET 内置的 INotifyPropertyChangedICommand,再配合 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 只含 IdName 等自动属性
  • 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 + 绑定属性三步走。