我目前正在尝试升级现有的WPF应用程序。 它主要使用代码隐藏,但它们逐渐转换为MVVM模式。 到目前为止,他们已经通过以下构造在代码中实现了MVVM:
//code located in codebehind of the ParentView
var childViewModel = new ChildViewModel();
childViewModel.Initialize(BusyWatcher);
var childView = new ChildView { DataContext = childViewModel}; ContentPresenterParent.Content = childView;
这对他们有用,他们可以通过使用例如
绑定到视图中的childViewModel属性Text="{Binding ChildViewModelProp1}"
现在我们已将解决方案从.net 3.5升级到4.6.1(升级到4.0具有相同的行为)我们发现以下behvaviour。
虽然我们将childView上的datacontext设置为childViewModel,并且这似乎在单步执行代码时正确完成,但DataContext似乎重置为自身(childView)。这似乎是在不触发DataContextChangedEvent的情况下完成的。
通过查看Snoop以及输出窗口中我们收到以下错误就可以看出这一点: BindingExpression路径错误:' ChildViewModelProp1'在' object'上找不到的属性'' ChildView' (名称='')&#39 ;. BindingExpression:路径= ChildViewModelProp1;的DataItem =' ChildView'
什么可能导致DataContext被覆盖/重置?为什么通过从.net 3.5迁移到4.6.1(或4.0)来引入此行为?
此行为的解决方法可能是将xaml绑定到
Text="{Binding DataContext.ChildViewModelProp1}"
但这不是一个很好的解决方案。
答案 0 :(得分:1)
问题在于ContentPresenter,当您设置DataContext时,它会将其更改回父控件的Parent DataContext。这里有更多关于这个问题。