0

目前我正在设计一个应用程序,该应用程序应该能够使用数据绑定(涉及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}" />不被评估。

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

4

1 回答 1

0

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

于 2016-03-10T09:37:54.930 回答