WPF中的数据绑定现象(绑定到FrameworkElement) - 任何想法为什么?

Sto*_*ver 10 data-binding wpf

在我的应用程序中(这与非常动态的导航和内容呈现有关)我必须在XAML中使用这个构造:

<ContentControl Content={Binding ContentElement} />
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.这很棒,绝对棒极了.我可以在任何地方接待任意的东西.

但似乎有一个奇怪的,好吧,让我们称之为WPF中的"现象"(我相信它在BindingMarkupExtension中,但还不确定):

当我的ContentElement属性如下所示:

public FrameworkElement ContentElement
{
    get
    {
        return this.m_ContentElement;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后getter被称为TWICE(!!!)用于每个数据绑定操作(这包括用户在运行时更改语言或重新加载主机控件时).

然而(这对我来说真是难以置信):

当我将ContentElement属性更改为:

public object ContentElement
{
    get
    {
        return this.m_ContentElement;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后getter被调用一次.说真的,我不是在这里.它在最简单的应用程序中绝对可重现,您可以尝试返回一个新的"TextBlock"(这就是我通常用来测试或了解更高级的WPF概念).

有什么想法吗?

我问的原因是我讨厌解决方案的以下后果:

  • 我此时失去了类型安全性
  • 这可能有点难以向新开发人员解释或过于持怀疑态度

Kre*_*eol 4

我能够为 .NET 4.0 重现它,但当您在项目的首选项中设置 .NET 3.5 框架时,它无法为同一应用程序重现。对于 .NET 4.0 - 如果 getter 类型为 FrameworkElement,则有 2 次调用。但内部堆栈不同。所以这肯定是因为 WPF 4.0 的一些内部原因。嗯……很难弄清楚它为什么以及如何以这种方式工作。如果时间允许,有人可以使用 Reflector 来研究 WPF 内部结构,但我相信这是滚雪球般的机会:)