访问RoutedEventArgs嵌套Tag属性报无定义错误如何解决
报错原因
e.OriginalSource 属性的静态声明类型是 object,C# 编译器做静态类型检查时,只会识别object类型自带的公开成员,而object类型没有定义Tag属性,所以写e.OriginalSource.Tag会直接报编译错误。
你调试时能在断点下看到Tag属性,是因为调试器读取的是运行时该对象的实际类型(也就是你创建的ListBoxItem实例)的成员,和编译阶段的静态校验逻辑无关。
修复方案
先把e.OriginalSource显式转换为ListBoxItem类型,再访问对应属性即可,推荐用模式匹配做安全转换,同时避免路由事件冒泡时OriginalSource是控件内部子元素导致的转换异常:
private void Address_Clicked(object sender, RoutedEventArgs e) { if (e.OriginalSource is ListBoxItem selectedItem && selectedItem.Tag is AddressInfo addressInfo) { // 直接从强类型业务模型取地址,不需要靠ToString()截取字符串 GeocodeAddressTbx.Text = addressInfo.Address_Full; // 后续可直接使用addressInfo下的ID、Nickname、Notes等所有业务字段 } }
注意:你之前用
ToString()替换固定前缀取地址的写法稳定性很差,只要.NET版本变更、控件模板调整导致ListBoxItem的ToString()返回格式变化,截取逻辑就会失效,直接读取Tag里存的强类型业务数据才是合规写法。
- 不要直接写强制转换
(ListBoxItem)e.OriginalSource,路由事件触发时OriginalSource可能是ListBoxItem可视化树内部的子元素(比如显示文本的TextBlock),直接强转容易抛出运行时异常。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

