在 Avalonia 的 MVVM 模式中,ViewModel 不应直接操作 UI 控件(如 `Window` 或 `ContentControl`),而是通过状态变更触发视图自动更新。导航的核心是“改变当前页面的 ViewModel 实例”,由框架根据 `ViewLocator` 自动匹配并渲染对应 View。
用 CurrentPage 属性驱动视图切换
在主窗口的 ViewModel(如 `MainWindowViewModel`)中定义一个可绑定的 `CurrentPage` 属性,类型为基类 `ViewModelBase`:
该属性值设为新页面的 ViewModel 实例(如 `new AboutViewModel()`) 在 XAML 中,`TransitioningContentControl` 绑定到 `CurrentPage`:手动管理导航历史(支持返回)
若需实现类似浏览器的前进/后退,可在 ViewModel 中维护一个栈来保存历史页面:
使用 `Stack避免硬编码 View 实例,保持解耦
不要在 ViewModel 中 new View 或调用 `Window.ShowDialog()` 等 UI 操作 —— 这会破坏 MVVM 分层原则:
所有导航都应通过变更 ViewModel 状态完成 如需模态对话框(如登录、确认),建议用服务注入方式(如 `IDialogService`),由专门的服务层负责打开窗口并返回结果 若使用 Prism.Avalonia,可用 `INavigationService.NavigateAsync("AboutView")`,它内部仍基于 ViewModel 切换,但封装了路由字符串和参数传递逻辑确保 ViewLocator 正确注册
项目启动时(通常在 `App.xaml.cs` 的 `OnFrameworkInitializationCompleted` 或 `InitializeComponent` 后),需确认 `ViewLocator` 已启用:
默认模板已配置,无需额外代码;若手动修改过,检查是否保留了类似以下注册: AvaloniaLocator.CurrentMutable.Bind