【发布时间】:2016-09-02 22:05:01
【问题描述】:
我目前正在尝试升级现有的 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 具有相同的行为)我们发现以下行为。
虽然我们将 childView 上的 datacontext 设置为 childViewModel,并且在单步执行代码时观察到这似乎正确完成,但 DataContext 似乎重置为自身(childView)。这似乎是在不触发 DataContextChangedEvent 的情况下完成的。
通过查看 Snoop 可以明显看出这一点,并且在输出窗口中我们收到以下错误: BindingExpression 路径错误:在“对象”“ChildView”(名称=“”)上找不到“ChildViewModelProp1”属性。绑定表达式:路径=ChildViewModelProp1; DataItem='ChildView'
什么可能导致 DataContext 被覆盖/重置,为什么从 .net 3.5 迁移到 4.6.1(或 4.0)会引入这种行为?
解决此问题的方法可能是将 xaml 绑定到
Text="{Binding DataContext.ChildViewModelProp1}"
但这并不是一个很好的解决方案。
【问题讨论】: