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
相关产品推荐
相关产品推荐

