惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
博客园 - 司徒正美
Jina AI
Jina AI
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
S
SegmentFault 最新的问题
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - Franky
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - wzwyc

FreeSql事务型提交 搜索并下载WINDOWS系统补丁 VS2019/2022/2026内网安装闪退的问题 Windows 7开发环境的问题笔记 C#颜色转换 C#把整型数值转16进制字符串 RocketMQ调研笔记 20260507随笔 在Zed中设置Xiaomi MiMo OxyPlot显示Legend图例 apache-iotdb-0.13.3-all-bin在WINDOWS 11系统上部署运行的问题 任务栏上的图标无法正常显示 应用启动时加载XML报错的问题处理 C#编译报错:可在所有平台上访问此调用站点。"xxxxxxxxxx" 仅在 "Windows" 7.0 及更高版本 上受支持。 C#系统下LINUX系统下组播数据的接收 消除只能在WINDOWS系统上使用的编译报警提示 WpfMultiStyle笔记 Kafka调研笔记 利用HtmlAgilityPack抓取网页的标题 关于Process的使用 Anaconda使用笔记 python下的plotly把图表转换成HTML 利用NAudio实现对音频设备的控制(静音、音量调节) 利用MathNet.Numerics求均方根 .NET 8以上版本,字节数组转字符串 .NET 8项目下载所有依赖到指定目录 异常的处理
Prism的LoadedCommand命令没有被调用的问题
wzwyc · 2026-03-19 · via 博客园 - wzwyc

LoadedCommand命令没有被调用的问题

使用了Prism的Ioc框架。MainWindow上注册了LoadedCommand命令,绑定到窗体的Loaded事件。

但奇怪的是,所有的功能都正常,就是LoadedCommand命令没有被调用。

后面发现是因为我在MainWindow.xaml上面没有写下面的绑定:

prism:ViewModelLocator.AutoWireViewModel="True"

问题是没写这句代码的时候,为什么其它的功能和命令都是正常的,唯独这个LoadedCommand命令没有被调用?

问了AI,AI给出来的答案是,没有指定的时候,运行这个窗体的时候,框架本身也是会去绑定ViewModel到DataContext上,但绑定的工作发生在Loaded事件之后。
然后窗体的Loaded事件一般只会触发一次,所以就错过了。

为什么Prism的Catch接口,如何OnOpenSourceFolder方法是async的,它就捕获不到异常信息?

Catch 能捕获到的前提是:异常必须在 DelegateCommand.Execute() 这条同步调用链里“直接抛出来”。

在你这行代码里:

  • new DelegateCommand(OnOpenSourceFolder, ...)Execute 委托类型是 Action(同步、无返回值)
  • .Catch(CatchError) 本质上就是在 Execute 外面包一层 try/catch,只能抓到 同步抛出的异常

一旦你把 OnOpenSourceFolder 改成 async,常见会出现两种情况,都会让 Catch 抓不到:

  • async void:异常会在 await 之后的“续体”里抛到 SynchronizationContext/Dispatcher 上,已经不在 Execute() 的 try/catch 范围内了(所以 Catch 看不到)。
  • async Task 但用 DelegateCommand 去绑:因为 DelegateCommand 只收 Action,你写 new DelegateCommand(async () => await XxxAsync()) 时,编译器会把这个 lambda 变成 async void 来匹配 Action,结果仍然回到上一条,异常不会被 Catch 捕获。

要让异常可控,有两类正确做法:

  • 用“会 await 的命令类型”:例如 Prism 的 DelegateCommand.FromAsyncHandler(Func<Task>)(如果你当前 Prism 版本支持),这样命令内部会等待 Task,异常就能在命令链路里处理。
  • 在 async 方法内部自己 try/catch:把 await 包在 try/catch 里,然后在 catch 里调用你的 CatchError(ex)(这是最通用、跟 Prism 版本无关的办法)。

补充:如果你不捕获,async void 的异常通常最终会走到 Application.DispatcherUnhandledException(UI 线程)或 TaskScheduler.UnobservedTaskException(任务未观察到异常)这类全局兜底处理,而不是走 DelegateCommand.Catch