1. 程式人生 > >WPF ViewModel與多個View綁定後如何解決的問題

WPF ViewModel與多個View綁定後如何解決的問題

如果 dict depend tor 重復 for hashtable hash class

原文: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();

WPF ViewModel與多個View綁定後如何解決的問題