WPF MVVM集成MahApps启动报Context is not registered错误如何解决?
问题根因
报错是两个原因共同导致的:
- 时序问题:你在ShellWindow构造函数中直接初始化PageOne并触发异步加载,此时ShellWindow的XAML绑定还未完成,
DialogParticipation.Register的注册逻辑还没生效。 - 上下文不匹配:你调用
ShowMessageAsync时传入的第一个参数是PageOne的实例,但你只给ShellWindow注册了Dialog参与,并未给PageOne注册,对话框找不到对应的上下文。
修复方案
方案1:调整加载时机+复用ShellWindow的注册上下文(推荐)
- 不要在Page的构造函数中直接触发异步数据加载,改为监听Page的
Loaded事件,等整个视觉树挂载完成、所有注册逻辑生效后再加载数据,同时避免async void的异常风险。 - 调用对话框时传入ShellWindow的注册上下文,无需额外给Page加注册。
修改后的PageOne代码:
public PageOne(IDialogCoordinator dialogCoordinator, ShellWindow shellWindow) { InitializeComponent(); _dialogCoordinator = dialogCoordinator; _shellWindow = shellWindow; DataContext = this; // 等页面加载完成后再执行数据加载 Loaded += async (s, e) => await LoadReports(); } private async Task LoadReports() { try { // API 请求逻辑 } catch (Exception ex) { // 传入ShellWindow的注册上下文 await _dialogCoordinator.ShowMessageAsync(_shellWindow.DataContext, "Error", ex.Message, MessageDialogStyle.Affirmative); } }
方案2:给Page单独注册Dialog参与
如果希望Page可以独立使用对话框,直接在PageOne的XAML根节点添加注册即可,不需要调整调用参数:
<Page x:Class="PageOne" xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" Dialog:DialogParticipation.Register="{Binding}"> <!-- 页面其他内容 --> </Page>
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

