UWP中ExpandoObject的PropertyChanged事件无法更新UI求助
解决UWP DataGrid绑定ExpandoObject时数据更新不同步UI的问题
问题根源
ExpandoObject虽实现了INotifyPropertyChanged,但仅通过动态成员语法(dynamic)修改属性时才会自动触发PropertyChanged事件;若通过IDictionary<string, object>接口修改键值对,不会触发该事件,导致DataGrid绑定无法感知数据变化,UI也就不会实时更新。
解决方案
方案1:改用动态成员语法修改属性(推荐)
直接通过dynamic类型访问ExpandoObject的属性,让其自动触发事件:
private void TestUpdateFirstItem(object sender, RoutedEventArgs e) { dynamic firstRow = Items[0]; firstRow.first = "Test Update Cell"; }
修改后,DataGrid会立即同步更新UI。
方案2:手动触发PropertyChanged事件(适配字典修改场景)
若因业务需求必须通过IDictionary接口修改,可手动获取INotifyPropertyChanged实例并触发事件:
private void TestUpdateFirstItem(object sender, RoutedEventArgs e) { var firstRow = (IDictionary<string, object>)Items[0]; var notifyObj = Items[0] as INotifyPropertyChanged; if (firstRow.ContainsKey("first")) { firstRow["first"] = "Test Update Cell"; // 手动触发对应属性的变更事件 notifyObj?.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("first")); } }
补充说明
- 你当前的
TwoWay绑定设置是正确的,问题核心在于ExpandoObject的事件触发机制差异。 - 动态增删列时,新增属性同样建议使用
dynamic语法设置,或针对新增属性名手动触发PropertyChanged事件,即可保证UI同步。
提问小建议
后续提问可补充HandlePropertyChanges方法的实现代码,方便验证事件触发的具体场景;另外可明确说明测试事件触发时使用的是dynamic还是字典修改方式,能更快定位问题。
内容的提问来源于stack exchange,提问作者Sharkken
相关产品推荐
相关产品推荐

