在我的应用程序中(这与非常动态的导航和内容呈现有关)我必须在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概念).
有什么想法吗?
我问的原因是我讨厌解决方案的以下后果:
我能够为 .NET 4.0 重现它,但当您在项目的首选项中设置 .NET 3.5 框架时,它无法为同一应用程序重现。对于 .NET 4.0 - 如果 getter 类型为 FrameworkElement,则有 2 次调用。但内部堆栈不同。所以这肯定是因为 WPF 4.0 的一些内部原因。嗯……很难弄清楚它为什么以及如何以这种方式工作。如果时间允许,有人可以使用 Reflector 来研究 WPF 内部结构,但我相信这是滚雪球般的机会:)
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |