【问题标题】:view.datacontext changes after .net upgrade 3.5 -> 4.61.net 升级 3.5 -> 4.61 后 view.datacontext 发生变化
【发布时间】: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}"

但这并不是一个很好的解决方案。

【问题讨论】:

    标签: c# .net wpf mvvm


    【解决方案1】:

    ContentPresenter 存在问题,当您设置 DataContext 时,它会将其更改回父控件的 Parent DataContext。这里有更多关于这个问题的内容。

    可以在此处找到有关此问题的更多信息。 https://alexfeinberg.wordpress.com/2014/10/11/wpf-the-real-difference-between-contentcontrol-and-contentpresenter/

    【讨论】:

    • 感谢 juanvan,这似乎确实是这种情况。用 ContentControl 切换 ContentPresenter 似乎是一个优雅的修复。迁移到更高版本的 .net 框架后,这种行为仍然很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 2014-11-16
    • 2010-10-06
    • 1970-01-01
    • 2020-12-07
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多