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

WPF委托事件故障:无法将Customer的GUID传递至MainViewModel

问题解决:委托事件无法传递到MainViewModel

核心原因

你当前存在两个完全独立的CustomerListViewModel实例:

  • 一个是在MainWIndowViewModel中创建,并订阅了PlaceOrderRequested事件的实例
  • 另一个是在CustomerListView的XAML中通过<local:CustomerListViewModel/>硬编码创建的实例

UI实际绑定的是第二个实例,而你在MainViewModel里订阅事件的是第一个实例,所以点击按钮触发PlaceOrderCommand时,事件只会在UI自己的ViewModel实例上触发,MainViewModel完全接收不到。

解决方案

步骤1:移除CustomerListView中硬编码的DataContext

打开CustomerListView.xaml,删除以下代码块:

<UserControl.DataContext>
    <local:CustomerListViewModel/>
</UserControl.DataContext>

这样UserControl会自动继承父容器的DataContext(也就是MainViewModel中CurrentViewModel绑定的那个实例)。

步骤2:确认MainViewModel的导航逻辑正确

你的MainWIndowViewModel中的OnNav命令已经正确设置了导航到customers时,将CurrentViewModel赋值为自己持有的customerListViewModel实例,这部分无需修改:

case "customers":
    CurrentViewModel = customerListViewModel;
    break;

可选优化:确保事件触发安全

虽然你已经给事件赋值了空委托delegate {}避免空引用,也可以在触发事件时显式检查(习惯用法):

[RelayCommand]
void PlaceOrder(Customer obj)
{
    PlaceOrderRequested?.Invoke(obj.CustomerId);
}

验证逻辑

修改后,当你导航到客户页面时,UI会绑定到MainViewModel中创建的customerListViewModel实例,点击"Place Order"按钮触发命令时,会调用该实例的PlaceOrder方法,进而触发PlaceOrderRequested事件,而MainViewModel已经订阅了这个事件,就能正常接收并执行后续逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:30:48