当重复创建View并绑定同一个ViewModel后,ViewModel中的字段更新,在新的View中的没有反应或者在View中找不到相应的视觉树(如ListBox的ListBoxItem)

初始的解决方案:View关闭后,注销属性Unregister Dependency

如果可以将属性注销,貌似是可行的

注销属性 RemoveDependency(LoadCousewareItemAnimationProperty);

 1 private void RemoveDependency(DependencyProperty prop)
 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
 9     genericMeth.Invoke(list, new[] { prop });
10   }
11   catch (TargetInvocationException)
12   {
13     Console.WriteLine("Does not exist in list");
14   }
16   var propertyFromNameField = typeof(DependencyProperty).
17     GetField("PropertyFromName", BindingFlags.NonPublic | BindingFlags.Static);
18   var propertyFromName = (Hashtable)propertyFromNameField.GetValue(null);
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);
  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();
唐宋元明清2188 http://www.cnblogs.com/kybs0/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。 当重复创建View并绑定同一个ViewModel后,ViewModel中的字段更新,在新的View中的没有反应或者在View中找不到相应的视觉树(如ListBox的ListBoxItem)初始的解决方案:View关闭后,注销属性Unregister Dependency。如果可以将属性注销,貌似是可行的注销属性RemoveDependency(L... 参考:https://www.youtube.com/watch?v=xUwk2-_tRzo 1.新建WPF工程项目,命名为Multiple Views. 在解决方案中新建两个文件夹ViewModels与Views来存放各种视图,具体的内容后面说。 2....
MVVM的目标之一就是为了解耦ViewViewModelView负责视图展示,ViewModel负责业务逻辑处理,尽量保证 View.xaml.cs中的简洁,不包含复杂的业务逻辑代码。 但是在实际情况中是ViewViewModel之间的交互方式还是比较复杂的,ViewViewModel的分离并不是界定的那么清晰。 比如以下两种场景: 1、如果需要某张视图页面弹...
公司的需求,看了看之前的代码,同一个控件在好几个地方用到了,现在需求要求不同界面显示不同的数据,只需要在MVVM绑定的时候增加自定义属性即可。 首先在控件的xaml.cs代码中增加属性 然后调试生成解决方案,再在界面调用控件的xaml里面加上属性 最后在绑定MVVM的时候带上和这个type即可 最后的最后,viewModel初始化的时候获取到type,然后根据type,写方法设置加载的数据即可。