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

Nei*_*ell 6 c# wpf xaml binding xamlreader

我正在XamlReader成功使用加载xaml文件并创建一个FrameworkElement可以使用的文件.

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

<TextBlock Text="{Binding DataContextTextProperty}" />
Run Code Online (Sandbox Code Playgroud)

如果我将FrameworkElement放回到XamlReader.Load()WPF窗口,那么绑定一切正常.

但是,在这种情况下,我正在使用Laurent Bugnion关于从WPF/XAML创建PNG的优秀文章.由于结果XamlReader.Load()是通过a直接写入PNG VisualBrush,因此似乎绕过了WPF调用绑定表达式的必要机制.

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

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

提前谢谢了.

Nei*_*ell 5

我修好了它!!

咳咳,让我解释一下……

我现在不知道我是怎么做到的,但我在 MSDN 上找到了一篇听起来很有帮助的文章,关于初始化不在对象树中的对象

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

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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

...

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

element.EndInit();
element.UpdateLayout();
Run Code Online (Sandbox Code Playgroud)

我添加了BeginInit(), EndInit()and UpdateLayout()(虽然通过消除过程我认为UpdateLayout()是关键),现在我动态加载的 xaml 中的绑定表达式工作正常。欢呼!