目前我正在设计一个应用程序,该应用程序应该能够使用数据绑定(涉及FlowDocument
)从 Xaml 模板文件创建报告。
这个想法是通过 BlockUIContainer 简单地将动态加载的控件转换为可在 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()
方法所做的所有事情都是从 a 中读取并FileStream
通过 .parse 内容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>
现在应用程序应该BlockUIContainer
根据数据集动态添加 s。我需要在后面的代码中实现自定义分页,因为报告可能会超过一页。
由于我只需要一个模板文件,因此我将页眉、页脚和分组控件全部打包在一个 xaml 文件中,如下所示:
<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的<Grid ... />
控件正是前面示例中使用的 Grid 控件。
现在我所做的就是获取 BlockUIContainer 的子对象,并通过将其保存到字符串并返回到 aFrameworkElement
并设置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>
,但没有一个类似的绑定<TextBlock Text="{Binding Path=Country}" />
不被评估。
我在这里不知所措。解析后如何让剩余的绑定再次工作?我真的不想为一个文档创建多个文件。