为什么动态加载控件上的数据绑定会中断?

时间:2016-03-10 09:07:13

标签: wpf data-binding xamlreader

目前,我设计的应用程序应该能够使用数据绑定(涉及<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>)从Xaml模板文件创建报告。

我们的想法是通过BlockUIContainer简单地将动态加载的控件转换为可在FlowDocument中打印。

只要我将整个文件加载到单个FlowDocument并设置FrameworkElement属性,数据绑定就像魅力一样。

DataContext

foreach (Order order in orders) { BlockUIContainer container = new BlockUIContainer(); container.Child = (FrameworkElement)GetOrderControl(); (container.Child as FrameworkElement).DataContext = order; document.Blocks.Add(container); } Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new Action(() => { return; })); 中读取所有GetOrderControl()方法,并通过FileStream解析内容。该文件的结构如下:

XamlReader.Load()

现在,应用程序应根据数据集动态添加<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ... <TextBlock Text="{Binding Path=Country}" /> ... </Gird> 。我需要在后面的代码中执行它来实现自定义分页,因为报告可能会超过一页。

由于我只需要一个模板文件,因此我将页眉,页脚和分组控件打包在一个xaml文件中,如下所示:

BlockUIContainer

&#34;元素&#34;中的<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <BlockUIContainer Name="PageHeader"> <Grid ... /> </BlockUIContainer> <BlockUIContainer Name="Element"> <Grid ... /> </BlockUIContainer> </FlowDocument> 控件名为BlockUIContainer的正好就是前面例子中使用的网格控件。

现在我所做的就是获取BlockUIContainer的孩子,并通过将其保存为字符串并返回<Grid ... />并设置FrameworkElement来创建该副本。

DataContext

然而,这里的数据绑定没有评估。设置foreach (Order order in orders) { BlockUIContainer container = new BlockUIContainer(); container.Child = (FrameworkElement)XamlReader.Parse(XamlWriter.Save(elementControl)); (container.Child as FrameworkElement).DataContext = order; document.Blocks.Add(container); } Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new Action(() => { return; })); 后,我尝试在UpdateLayout()上调用FrameworkElement方法。 这确实评估DataContext<DataTrigger Binding="{Binding Path=DangerousGoods}" />的至少一些绑定设置了一些子控件的可见性,但是没有评估像<Style>这样的绑定。

我在这里不知所措。解析后如何让剩余的绑定再次起作用?我真的不想为一个文档创建多个文件。

1 个答案:

答案 0 :(得分:0)

没关系,我发现错误......第一次创建控件时会对Bindings进行评估。 XamlWriter然后通过评估文本并将原始文本输出(空的)写入元素的Text属性来“销毁”绑定。