You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF MVVM集成MahApps启动报Context is not registered错误如何解决?

问题根因

报错是两个原因共同导致的:

  1. 时序问题:你在ShellWindow构造函数中直接初始化PageOne并触发异步加载,此时ShellWindow的XAML绑定还未完成,DialogParticipation.Register的注册逻辑还没生效。
  2. 上下文不匹配:你调用ShowMessageAsync时传入的第一个参数是PageOne的实例,但你只给ShellWindow注册了Dialog参与,并未给PageOne注册,对话框找不到对应的上下文。

修复方案

方案1:调整加载时机+复用ShellWindow的注册上下文(推荐)

  1. 不要在Page的构造函数中直接触发异步数据加载,改为监听Page的Loaded事件,等整个视觉树挂载完成、所有注册逻辑生效后再加载数据,同时避免async void的异常风险。
  2. 调用对话框时传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 11:48:01