目前,我设计的应用程序应该能够使用数据绑定(涉及<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>
这样的绑定。
我在这里不知所措。解析后如何让剩余的绑定再次起作用?我真的不想为一个文档创建多个文件。
答案 0 :(得分:0)
没关系,我发现错误......第一次创建控件时会对Bindings进行评估。
XamlWriter
然后通过评估文本并将原始文本输出(空的)写入元素的Text
属性来“销毁”绑定。