Avalonia如何使用ReactiveUI框架 Avalonia ReactiveUI入门

5次阅读

直接上手 reactiveui + Avalonia 仅需三步:选对模板(新建项目时勾选“Avalonia .net MVVM app”并指定 ReactiveUI)、装好包(含 ReactiveUI.SourceGenerators)、写对绑定(用 RaiseAndSetIfChanged 或 [Reactive] 属性、ReactiveCommand 或 [ReactiveCommand] 方法、Routing 导航)。

Avalonia 如何使用 ReactiveUI 框架 Avalonia ReactiveUI 入门

直接上手 ReactiveUI + Avalonia,关键就三步:选对模板、装好包、写对绑定。不用从零配环境,官方模板已集成支持。

创建项目时就选 ReactiveUI

visual studio 或 Rider 新建 Avalonia 项目时,在模板选择页明确勾选“Avalonia .NET MVVM App”,下一步中 MVVM Toolkit 选项里 必须选 ReactiveUI(不是 CommunityToolkit 或默认空选项)。这一步决定后续所有 ViewModel 基类、命令写法和绑定语法是否原生可用。

  • 项目生成后,ViewModels 文件夹下自动带 MainwindowViewModel,继承 的是 ReactiveUI.ViewModelBase
  • Views 文件夹下 MainWindow.axaml 的 x:DataType 默认指向对应 ViewModel,启用编译时绑定检查
  • App.axaml.cs 中已配置好 Splat 依赖注入容器,可直接注册服务

数据绑定用 RaiseAndSetIfChanged 或 [Reactive]

ReactiveUI 提供两种主流方式让属性变更自动通知 UI:

  • 手动写:用 this.RaiseAndSetIfChanged(ref _field, value) 替代传统 INotifyPropertyChanged 实现
  • 自动写:加 [Reactive] 特性(需引用 ReactiveUI.SourceGenerators),编译期生成完整属性逻辑,代码更干净

例如:

[Reactive] public string? UserName {get; set;}<br>[Reactive] public bool IsLoading {get; set;}

命令绑定用 ReactiveCommand 或 [ReactiveCommand]

用户操作(如按钮点击)不直接写 事件 处理函数,而是暴露 ReactiveCommand 属性:

  • 基础写法:public ReactiveCommand<unit unit> SubmitCommand {get;}</unit>构造函数 中用 ReactiveCommand.Create(() => { ……})
  • 进阶写法:用 [ReactiveCommand] 特性(同样依赖 SourceGenerators),方法自动转为命令,支持 CanExecute 和执行 异步 逻辑
  • AXAML 中直接 Command="{Binding SubmitCommand}",无需 CommandParameter 包装

页面导航靠 Routing + ViewModel 激活

ReactiveUI 内置 路由 系统,适合多页应用:

  • 主窗口 ViewModel 继承 RoutableViewModel,声明 RoutingState 实例
  • 子页面 ViewModel 继承 ReactiveViewModel,并实现 IActivatableViewModel
  • 跳转用 router.Navigate.Execute(new DetailViewModel()),返回用 Router.NavigateBack()
  • 页面激活 / 失活逻辑(如加载数据、清理订阅)放在 WhenActivated 块里,避免内存泄漏

基本上就这些。不复杂但容易忽略的是:每次新建 ViewModel 都要确认基类是 ReactiveUI 的,而不是 Avalonia 自带的 ViewModelBase;绑定语法保持一致,别混用 CommunityToolkit 的 [ObservableProperty]。跑通一个按钮 + 文本更新,后面就顺了。

站长
版权声明:本站原创文章,由 站长 2025-12-18发表,共计1636字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources