2016-09-01 67 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框架改变了行为。 –

相关问题