博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF ViewModel与多个View绑定后如何解决的问题
阅读量:6375 次
发布时间:2019-06-23

本文共 1710 字,大约阅读时间需要 5 分钟。

原文:

当重复创建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();

 

转载地址:http://zsnqa.baihongyu.com/

你可能感兴趣的文章
重构第20天 提取子类(Extact SubClass)
查看>>
plsql 执行批量文件
查看>>
MVC之Ajax.BeginForm使用详解之更新列表
查看>>
.Net中的AOP系列之《拦截位置》
查看>>
CentOS全自动一键安装PHP,MySQL,phpmyadmin与Nginx
查看>>
tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
查看>>
[转]MySQL DBA面试全揭秘
查看>>
enter键触发事件
查看>>
关于binary log一点总结[转]
查看>>
Android判断屏幕锁屏的方法总结
查看>>
文件/文件夹权限设置命令chmod的具体使用方法
查看>>
AngualrJS之服务器端通信
查看>>
【第二十六章】 hystrix-dashboard + turbine
查看>>
一个有意思的Ruby Webdriver超时问题的解决过程
查看>>
企商云惠--我的起点
查看>>
Windows下Nginx的启动、停止等命令
查看>>
[转]kaldi特征和模型空间转换
查看>>
元类与面向切面编程
查看>>
40.Node.js Web 模块
查看>>
Mac+iPhone 移动端真机调试
查看>>