我目前正在嘗試升級現有的WPF應用程序。 它主要使用代碼隱藏,但它們逐漸轉換爲MVVM模式。 到目前爲止,他們已經通過下面的結構在代碼中實現MVVM:.net升級後view.datacontext更改3.5 - > 4.61
//code located in codebehind of the ParentView var childViewModel = new ChildViewModel(); childViewModel.Initialize(BusyWatcher); var childView = new ChildView { DataContext = childViewModel}; ContentPresenterParent.Content = childView;
這爲他們工作,他們可以通過使用例如
Text="{Binding ChildViewModelProp1}"
綁定到視圖中的childViewModel性質現在我們已經將.net 3.5解決方案升級到4.6.1(升級到4.0具有相同的行爲),我們發現以下問題。
儘管我們將childView上的datacontext設置爲childViewModel,並且這似乎按照單步執行代碼時所觀察的那樣正確地完成,但DataContext似乎重置爲自身(childView)。這似乎是在不觸發DataContextChangedEvent的情況下完成的。
通過查看Snoop以及在輸出窗口中,我們會收到以下錯誤: BindingExpression路徑錯誤:'ChildView''''ChildView'(Name ='')'上找不到'ChildViewModelProp1'屬性。 BindingExpression:路徑= ChildViewModelProp1; DataItem ='ChildView'
什麼會導致DataContext被覆蓋/重置,以及爲什麼通過從.net 3.5遷移到4.6.1(或4.0)引入此行爲?
針對此行爲的解決方法可能是綁定XAML來
Text="{Binding DataContext.ChildViewModelProp1}"
但是,這是不是一個真正的很好的解決方案。
謝謝juanvan,這的確好像是情況。用ContentControl切換ContentPresenter看起來是一個很好的解決方案。通過遷移到更高級的.net框架改變了行爲。 –