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

Prism框架扩展DialogService时全局注册通用对话框的方法咨询

问题1:Prism中关联NotificationDialog和NotificationDialogViewModel的方式

你给出的注册代码本身就已经完成了二者的绑定:
containerRegistry.RegisterDialog<NotificationDialog, NotificationDialogViewModel>() 是Prism提供的显式注册对话框的API,调用这个方法后,Prism会直接将传入的View与指定ViewModel做关联,不需要额外配置。
如果你不想显式指定ViewModel,也可以依赖Prism的ViewModelLocator自动匹配规则:只要ViewModel符合「和View同名称空间/在View对应名称空间的ViewModel子目录下、类名为View名称+ViewModel后缀」的约定,就可以直接写containerRegistry.RegisterDialog<NotificationDialog>(),Prism会自动找到对应的NotificationDialogViewModel进行绑定。显式注册的方式更适合你这种跨项目共用的公共组件场景,关联关系更清晰,不受命名/名称空间约定限制。

问题2:全局对话框的注册位置

你提到的在Main项目的App.xaml.cs的RegisterTypes方法中注册是完全可行的,只要主项目引用了Core项目,能正常访问NotificationDialog和NotificationDialogViewModel两个类即可。
如果想要进一步解耦,避免主项目依赖Core项目的内部实现,也可以把注册逻辑封装到Core项目的扩展方法中:

  1. 在Core项目中新增容器注册扩展类:
public static class CoreContainerRegistryExtensions
{
    public static void RegisterCoreCommonDialogs(this IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterDialog<NotificationDialog, NotificationDialogViewModel>();
        // 后续Core项目新增的公共对话框,都可以在这里统一注册
        // 注意你调用时指定的自定义窗口名notificationWindow,也需要在这里完成注册:
        // containerRegistry.RegisterDialogWindow<YourCustomNotificationWindow>("notificationWindow");
    }
}
  1. 在主项目的RegisterTypes方法中直接调用扩展方法即可:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterCoreCommonDialogs();
    // 其他主项目的注册逻辑
}

这种方式后续Core项目新增公共对话框时,不需要修改主项目的注册代码,维护性更好。


内容的提问来源于stack exchange,提问作者Buruhazard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:21:02