WPF中的数据绑定现象(绑定到FrameworkElement)- 有什么想法为什么会出现这种情况?

10

在我的一个应用程序中(涉及非常动态的导航和内容呈现),我必须在XAML中使用此结构:

<ContentControl Content={Binding ContentElement} />

到目前为止,一切都很好。这太棒了,绝对太棒了。我可以在各个地方托管任意的东西。

但是,在WPF中存在一个奇怪的东西,嗯,让我们称之为“现象”(我相信它在BindingMarkupExtension中,但还不确定):

当我的ContentElement属性看起来像这样时:

public FrameworkElement ContentElement
{
    get
    {
        return this.m_ContentElement;
    }
}

然后,对于每个数据绑定操作,getter都会被调用两次!!!(这包括当用户在运行时更改语言或重新加载宿主控件时)。

然而(这才是真正让我困惑的部分):

当我将ContentElement属性更改为:

public object ContentElement
{
    get
    {
        return this.m_ContentElement;
    }
}

然后getter方法会被调用一次。我不是在开玩笑,这是完全可以复现的,在最简单的应用程序中也可以尝试,例如通过返回一个新的“TextBlock”(这通常是我测试或学习更高级WPF概念的方法)。

有什么想法吗?

我之所以问这个问题,是因为我讨厌解决方案带来的以下后果:

  • 此时我失去了类型安全性
  • 这可能有些难以向新开发人员或过于怀疑的机智人士解释清楚

我无法在这里复现这个问题。无论哪种情况,getter都只会被调用一次。 - Zahid Sattar
1
可能与您所针对的框架版本有关。是3.0、3.5还是4? - user1228
是的,我忘记测试那个了。在3.5中没有,但在4.0中有。 - StormianRootSolver
你遇到了完全相同的问题... 你找到解决方案了吗? - lnu
2个回答

4

我能够在.NET 4.0中复现它,但是当你在项目首选项中设置.NET 3.5框架时,同一应用程序无法再现。在.NET 4.0的情况下-如果其类型为FrameworkElement,则有两个调用getter。但内部堆栈是不同的。所以这绝对是因为WPF 4.0的某些内部原因。嗯...很难弄清楚为什么以及如何以这种方式工作。如果时间允许,有人可以使用Reflector调查WPF内部,但我相信这是不可能的。


0

我曾经遇到过同样的问题,并在另一个论坛上从微软那里找到了答案: http://connect.microsoft.com/VisualStudio/feedback/details/554237/problem-binding-image-property-called-twice-for-each-item

正如Kreol所说,有趣的是这是在.NET 4.0中完成的。

我不知道该怎么想。它肯定是有意为之的,以提高性能或其他方面的东西。

在我们的情况下,我们有一个返回模型视图的属性,这个视图将在不同的屏幕上显示,因此我们不能使用单个字段实现一个

if (_localValue != null)

语句,并且必须每次获取属性时创建一个新的控件。 因此,这可能不再具有良好的性能。

还有其他想法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接