WPF ViewModel与多个View绑定后如何解决的问题
当重复创建View并绑定同一个ViewModel后,ViewModel中的字段更新,在新的View中的没有反应或者在View中找不到相应的视觉树(如ListBox的ListBoxItem)
初始的解决方案:View关闭后,注销属性Unregister Dependency。
如果可以将属性注销,貌似是可行的
注销属性 RemoveDependency(LoadCousewareItemAnimationProperty);

1 private void RemoveDependency(DependencyProperty prop) 2 { 3 var registeredPropertyField = typeof(DependencyProperty). 4 GetField("RegisteredPropertyList", BindingFlags.NonPublic | BindingFlags.Static); 5 object list = registeredPropertyField.GetValue(null); 6 var genericMeth = list.GetType().GetMethod("Remove"); 7 try 8 { 9 genericMeth.Invoke(list, new[] { prop }); 10 } 11 catch (TargetInvocationException) 12 { 13 Console.WriteLine("Does not exist in list"); 14 } 15 16 var propertyFromNameField = typeof(DependencyProperty). 17 GetField("PropertyFromName", BindingFlags.NonPublic | BindingFlags.Static); 18 var propertyFromName = (Hashtable)propertyFromNameField.GetValue(null); 19 20 object keyToRemove = null; 21 foreach (DictionaryEntry item in propertyFromName) 22 { 23 if (item.Value == prop){ 24 keyToRemove = item.Key; 25 return; 26 } 27 } 28 if (keyToRemove != null) 29 propertyFromName.Remove(keyToRemove); 30 }
运行了下,注销成功!
但是,随之来的新问题是,因旧View的DataContext依旧绑定着ViewModel,属性注销了,但是ViewModel的字段更新时,会找不到View的属性,直接抛出异常!
正确简洁的处理方案:UnLoaded事件中,设置DataContext = null
字段更新,不会通知到旧View。
值得注意的是,在View的依赖属性中,如属性添加了PropertyChanged事件,一定要将e.NewValue判空。
因属性之前绑定了数据,DataContext = null为空之后,会触发PropertyChanged。
Loaded += (s, e) => { if (DataContext == null) { DataContext = _viewModel; } }; Unloaded += (s, e) => { this.DataContext = null; };
_viewModel=new ViewModel();
分类:
WPF/Silverlight
标签:
WPF
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)