绑定不适用于动态加载的xaml

时间:2011-09-22 13:17:25

标签: c# wpf xaml binding xamlreader

我正在成功使用XamlReader加载xaml文件并创建一个FrameworkElement来使用。

我正在加载的xaml中包含绑定表达式,例如:

<TextBlock Text="{Binding DataContextTextProperty}" />

如果我放置FrameworkElement,我从XamlReader.Load()返回到WPF窗口,绑定一切正常。

但是,在这种情况下,我正在使用Laurent Bugnion's excellent article on creating PNGs from WPF/XAML。由于XamlReader.Load()的结果是通过VisualBrush直接写入PNG的,因此似乎绕过了WPF调用绑定表达式的必要机制。

这让我相信实际的绑定并不是真的只是通过调用XamlReader.Load()来调用,或者它们因为我不知道的事情而不能正常工作可视树,直到您将FrameworkElement添加到现有的可视树或其他内容。

我能做些什么来确保调用这些绑定吗?

非常感谢提前。

1 个答案:

答案 0 :(得分:4)

我固定它!!

嗯,请允许我解释......

我现在不知道我是怎么做到的,但我在MSDN上发现了一篇关于Initialization for Objects Not in an Object Tree的有用的文章。

在其中我找到了以下代码示例:

Button b = new Button();
b.BeginInit();
b.Background = Brushes.Blue;
b.Width = b.Height = 200;
b.EndInit();
b.Measure(paperSize);
b.Arrange(new Rect(paperSize));
b.UpdateLayout();

我查看了上面问题中提到的Laurent的(再次,优秀)示例,并按如下方式自定义XamlReader的使用:

var element = (FrameworkElement)XamlReader.Load(xamlInput);

element.BeginInit();
element.DataContext = dataContext;

...

element.Measure(renderingSize);
element.Arrange(renderingRectangle);

element.EndInit();
element.UpdateLayout();

我添加了BeginInit()EndInit()UpdateLayout()(虽然通过排除过程我相信UpdateLayout()是关键)现在我的动态加载中的绑定表达式xaml工作正常。乌拉!