2016-09-01 89 views
0

我目前正在嘗試升級現有的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}" 

但是,這是不是一個真正的很好的解決方案。

回答

1

問題是ContentPresenter,當您設置DataContext時,它將其更改回父控件的父級DataContext。這裏是更多的問題。

更多可以在這裏找到問題。 https://alexfeinberg.wordpress.com/2014/10/11/wpf-the-real-difference-between-contentcontrol-and-contentpresenter/

+0

謝謝juanvan,這的確好像是情況。用ContentControl切換ContentPresenter看起來是一個很好的解決方案。通過遷移到更高級的.net框架改變了行爲。 –

相關問題