在我的一个应用程序中(涉及非常动态的导航和内容呈现),我必须在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概念的方法)。
有什么想法吗?
我之所以问这个问题,是因为我讨厌解决方案带来的以下后果:
- 此时我失去了类型安全性
- 这可能有些难以向新开发人员或过于怀疑的机智人士解释清楚