0

現在、データバインディングを使用してXamlテンプレートファイルからレポートを作成できるアプリケーションを設計しています(aを含むFlowDocument)。

アイデアは、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()メソッドが行うことはすべて、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>

BlockUIContainerこれで、アプリケーションはデータセットに従って s を動的に追加する必要があります。レポートが 1 ページよりも長くなる可能性があるため、カスタム ページネーションを実装するにはコード ビハインドで行う必要があります。

必要なテンプレート ファイルは 1 つだけなので、ヘッダー、フッター、およびグループ化コントロールをすべて、次のように 1 つの 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 という名前の "Element" 内の<Grid ... />コントロールは、まさに前の例で使用された Grid コントロールです。

これで、BlockUIContainer の子を取得し、それを文字列に保存してから に戻しFrameworkElementDataContext.

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()した後、 でメソッドを呼び出してみました。それは、いくつかの子コントロールの可視性を設定する要素の少なくともいくつかのバインディングを評価しますが、評価されないようなバインディングはありません。FrameworkElementDataContext<DataTrigger Binding="{Binding Path=DangerousGoods}" /><Style><TextBlock Text="{Binding Path=Country}" />

私はここで途方に暮れています。解析後に残りのバインディングを再び機能させるにはどうすればよいですか? 1 つのドキュメントに対して複数のファイルを作成したくありません。

4

1 に答える 1