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 Code
运行了下,注销成功!
但是,随之来的新问题是,因旧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();
转载于:https://www.cnblogs.com/lonelyxmas/p/9697782.html
WPF ViewModel与多个View绑定后如何解决的问题相关推荐
- WPF自定义控件的自定义属性绑定后不更新问题
WPF自定义控件的自定义属性绑定后不更新问题 原文:WPF自定义控件的自定义属性绑定后不更新问题 需要在绑定时设置属性变更触发 UpdateSourceTrigger=PropertyChanged ...
- layui表格点击排序按钮后,表格绑定事件失效解决方法
layui表格点击排序按钮后,表格绑定事件失效解决方法 参考文章: (1)layui表格点击排序按钮后,表格绑定事件失效解决方法 (2)https://www.cnblogs.com/gongliha ...
- Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决
Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 参考文章: (1)Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 (2)https://www. ...
- WPF中的命令与命令绑定(二)
WPF中的命令与命令绑定(二) 周银辉 在WPF中,命令(Commanding)被分割成了四个部分,分别是IC ...
- maya绑定后的模型修改编辑技巧
灯光渲染是三维制作流程的最后环节,也是所有问题的汇总,由于大家任务量都很大,所以,能够我们改的就不反给前面流程了.当然虽然这样并不是好事,毕竟哪个环节的问题应该让他们知道,防微杜渐. 动画的穿帮问题是 ...
- blender绑定后,姿态模式 骨骼动 模型不动
就是这个样子,重复做了好几个模型,绑定后,切换到姿态模式,模型就是不能动,模型已经放大,已经合并顶点,已经3天了,找不到原因,卡在这里3天了,盼望帮忙解决
- ViewModel是如何在配置更改后继续留存数据的
文章目录 ViewModel是如何在配置更改后继续留存数据的 系统是如何保留和恢复`NonConfigurationInstances`的 ViewModel 和 onSaveInstanceStat ...
- android对view截图后,保存图片黑色背景问题
对view截图后,保存到本地发现背景是黑色的, 方案一: //对View进行截图,使控件可以进行缓存 llImg.setDrawingCacheEnabled(true); //获取缓存的 Bitma ...
- 如何在Maya中修改已经绑定后的模型的法线
前言:最近想把尼尔机械纪元的2B导入到UE中看看效果,可不知道是不是我解包的过程有问题,2B模型的裙子部分的发现有问题,而且裙子的模型还被拆分为了3个部分,直接软边是不管用的,而且已经绑定的模型就算修 ...
最新文章
- FPGA之道(31)VHDL编写注意事项
- python可以在哪些平台安装_python都有哪些版本,如何在你的计算机上运行python?...
- VS2010 SP1
- 【php内核与扩展开发系列】PHP生命周期---启动、终止与模式
- 修改SSO管理员密码
- colab加载google drive并且调试时跳过不运行
- python 调用bat失败_要想顺利通过Python面试,你最起码需要达到白银段位!
- ConfigurationManager.AppSettings[] ConfigurationManager智能显示不出来
- 採集和输出 DeckLink Studio 4K
- python在数据分析方面的应用、下列说法正确_智慧树知到大数据分析的python基础答案...
- python-摩尔斯电码查询器
- 机器学习原理与实践(开源图书)-总目录
- 二级域名间相互请求 ajax跨域请求
- x86为什么是32位系统?
- 几种常用的差异分析方法简介
- Heatmap-based Vanishing Point boosts Lane Detection 论文翻译
- 同时校验手机号和座机号
- 贷款计算公式——java实现
- strtok函数的实现
- python有序列表无序列表区别_用Python链表实现有序表与无序表