WPF ViewModel与多个View绑定后如何解决的问题
原文: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();

posted on 2018-09-25 08:48 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9697782.html

WPF ViewModel与多个View绑定后如何解决的问题相关推荐

  1. WPF自定义控件的自定义属性绑定后不更新问题

    WPF自定义控件的自定义属性绑定后不更新问题 原文:WPF自定义控件的自定义属性绑定后不更新问题 需要在绑定时设置属性变更触发 UpdateSourceTrigger=PropertyChanged ...

  2. layui表格点击排序按钮后,表格绑定事件失效解决方法

    layui表格点击排序按钮后,表格绑定事件失效解决方法 参考文章: (1)layui表格点击排序按钮后,表格绑定事件失效解决方法 (2)https://www.cnblogs.com/gongliha ...

  3. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 参考文章: (1)Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 (2)https://www. ...

  4. WPF中的命令与命令绑定(二)

    WPF中的命令与命令绑定(二)                                              周银辉 在WPF中,命令(Commanding)被分割成了四个部分,分别是IC ...

  5. maya绑定后的模型修改编辑技巧

    灯光渲染是三维制作流程的最后环节,也是所有问题的汇总,由于大家任务量都很大,所以,能够我们改的就不反给前面流程了.当然虽然这样并不是好事,毕竟哪个环节的问题应该让他们知道,防微杜渐. 动画的穿帮问题是 ...

  6. blender绑定后,姿态模式 骨骼动 模型不动

    就是这个样子,重复做了好几个模型,绑定后,切换到姿态模式,模型就是不能动,模型已经放大,已经合并顶点,已经3天了,找不到原因,卡在这里3天了,盼望帮忙解决

  7. ViewModel是如何在配置更改后继续留存数据的

    文章目录 ViewModel是如何在配置更改后继续留存数据的 系统是如何保留和恢复`NonConfigurationInstances`的 ViewModel 和 onSaveInstanceStat ...

  8. android对view截图后,保存图片黑色背景问题

    对view截图后,保存到本地发现背景是黑色的, 方案一: //对View进行截图,使控件可以进行缓存 llImg.setDrawingCacheEnabled(true); //获取缓存的 Bitma ...

  9. 如何在Maya中修改已经绑定后的模型的法线

    前言:最近想把尼尔机械纪元的2B导入到UE中看看效果,可不知道是不是我解包的过程有问题,2B模型的裙子部分的发现有问题,而且裙子的模型还被拆分为了3个部分,直接软边是不管用的,而且已经绑定的模型就算修 ...

最新文章

  1. FPGA之道(31)VHDL编写注意事项
  2. python可以在哪些平台安装_python都有哪些版本,如何在你的计算机上运行python?...
  3. VS2010 SP1
  4. 【php内核与扩展开发系列】PHP生命周期---启动、终止与模式
  5. 修改SSO管理员密码
  6. colab加载google drive并且调试时跳过不运行
  7. python 调用bat失败_要想顺利通过Python面试,你最起码需要达到白银段位!
  8. ConfigurationManager.AppSettings[] ConfigurationManager智能显示不出来
  9. 採集和输出 DeckLink Studio 4K
  10. python在数据分析方面的应用、下列说法正确_智慧树知到大数据分析的python基础答案...
  11. python-摩尔斯电码查询器
  12. 机器学习原理与实践(开源图书)-总目录
  13. 二级域名间相互请求 ajax跨域请求
  14. x86为什么是32位系统?
  15. 几种常用的差异分析方法简介
  16. Heatmap-based Vanishing Point boosts Lane Detection 论文翻译
  17. 同时校验手机号和座机号
  18. 贷款计算公式——java实现
  19. strtok函数的实现
  20. python有序列表无序列表区别_用Python链表实现有序表与无序表

热门文章

  1. FFmpeg源代码结构图 - 编码
  2. 开源视频质量评价工具: IQA
  3. 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
  4. html中怎么让字体闪烁,HTML最简单的文字闪烁代码
  5. linux下 db2日志满了,DB2事务日志已满的解决方法
  6. httplistener java_Java监听器listener的介绍
  7. zookeeper集群节点热扩容和迁移详解
  8. Helm 3 完整教程(七):Helm 函数讲解(1)逻辑和流控制函数
  9. Element UI 重置表单功能
  10. 【搞事情】从零开始做一个微信小程序