При печати с привязкой к данным FlowDocument потеряна привязка данных - PullRequest
1 голос
/ 29 июня 2011

Я теряю привязку данных при запуске процесса печати, это возможно?Это то, о чем я могу думать только в моей ситуации здесь, где у меня есть таблица внутри элемента управления, которая делает таблицу привязываемой к данным, все внутри FlowDocument.При запуске привязка данных работает нормально, и таблица рисует сама с некоторыми данными на ней без проблем.

Однако при печати вывод этого элемента управления всегда пуст.

I 'мы добавили ListView с теми же привязками, и при печати сгенерированных данных они тоже выглядят потерянными.

XAML:

<Window x:Class="GlassStore.InitBill"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:GlassStore.ViewModels"
        xmlns:flowdocs="clr-namespace:FlowDocuments;assembly=FlowDocument"
        Title="InitBill" Height="825" Width="1004">
<Window.DataContext>
    <local:InitBillViewModel/>
</Window.DataContext>
<Grid Background="White">
    <FlowDocumentReader HorizontalAlignment="Center"
                        HorizontalContentAlignment="Center">
        <FlowDocument ColumnWidth="999999"
                      IsColumnWidthFlexible="True"
                      TextAlignment="Center" 
                      Name="FD">
                <Paragraph>
                <ListView ItemsSource="{Binding GridTrans}">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Header="ffff"
                                 DisplayMemberBinding="{Binding CarModel}" />
                            <GridViewColumn Header="xxxx"
                                 DisplayMemberBinding="{Binding CarName}" />
                        </GridView>
                    </ListView.View>
                </ListView>
            </Paragraph>
            <Paragraph TextAlignment="Center">
                <TextBlock Text="{Binding test}" />
            </Paragraph>
            <flowdocs:ItemsContent ItemsSource="{Binding GridTrans}"
                                   Background="#FFF2C3C3"
                                   BorderThickness="2">
                <flowdocs:ItemsContent.ItemTemplate>
                    <DataTemplate>
                        <flowdocs:Fragment>
                            <Table>
                            <TableRowGroup flowdocs:Attached.IsItemsHost="True">
                                <TableRow Background="AliceBlue" >
                                    <TableCell Foreground="Red">
                                        <Paragraph>
                                            <flowdocs:BindableRun BoundText="{Binding CarName}" />
                                        </Paragraph>
                                    </TableCell>
                                    <TableCell Foreground="Green">
                                        <Paragraph>
                                            <flowdocs:BindableRun BoundText="{Binding CarModel}" />
                                        </Paragraph>
                                    </TableCell>
                                    <TableCell Foreground="Yellow">
                                        <Paragraph>
                                            <flowdocs:BindableRun BoundText="{Binding glassPrice}" />
                                        </Paragraph>
                                    </TableCell>
                                </TableRow>
                            </TableRowGroup>
                            </Table>
                        </flowdocs:Fragment>
                    </DataTemplate>
                </flowdocs:ItemsContent.ItemTemplate>
            </flowdocs:ItemsContent>
            <Table>
                <TableRowGroup>
                    <TableRow>
                        <TableCell>
                            <Paragraph>Row1 Cell1</Paragraph>
                        </TableCell>
                        <TableCell>
                            <Paragraph>Row2 Cell2</Paragraph>
                        </TableCell>
                    </TableRow>
                </TableRowGroup>
            </Table>  
        </FlowDocument>
    </FlowDocumentReader>
    <Button Command="{Binding print}"
            Content="إطـبع"
            Height="29" Margin="91,0,112,41"
            Name="button1"
            VerticalAlignment="Bottom" />
</Grid>
</Window>

Теперь я знаю, что проблема не в пользовательском элементе управления,потому что у меня сейчас та же проблема с ListView.

Я прикрепил источник к версии Windows здесь и печатной версии здесь .

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Было бы неплохо ViewModel, особенно метод, стоящий за командой печати.Я предполагаю, что потоковый документ помещается в специальный контекст печати и теряет текстовый текст окна.

Попробуйте удалить

<Window.DataContext>
    <local:InitBillViewModel/>
</Window.DataContext>

и использовать

<FlowDocumentReader HorizontalAlignment="Center" HorizontalContentAlignment="Center">
    <FlowDocumentReader.DataContext>
        <local:InitBillViewModel/>
    </FlowDocumentReader.DataContext>
...

вместо.Может быть, это поможет?

Редактировать: команда печати должна была бы перейти к другой ViewModel, чтобы все еще работать, конечно.Эта другая ViewModel останется там, где была старая, в Window.DataContext.

0 голосов
/ 14 июля 2017

Вот мое решение:

  1. определить документ в отдельном файле XAML:

Загрузить документ потока из словаря ресурсов Xaml

затем выведите:

    var prntDlg = new PrintDialog();
    var res = Application.LoadComponent(new Uri("/Resources/ReportDocument.xaml", UriKind.RelativeOrAbsolute)) as ResourceDictionary;
    var doc = res["ReportFlowDoc"] as FlowDocument;

    doc.DataContext = this.fdswReport.Document.DataContext; //your FlowDocumentScrollViewer
    doc.PageWidth = prntDlg.PrintableAreaWidth;
    doc.PageHeight = prntDlg.PrintableAreaHeight;
    doc.ColumnWidth = prntDlg.PrintableAreaWidth;
    doc.PagePadding = new Thickness(80);
    doc.IsOptimalParagraphEnabled = true;
    doc.IsHyphenationEnabled = true;

    if (prntDlg.ShowDialog() == true)
        prntDlg.PrintDocument(((IDocumentPaginatorSource)doc).DocumentPaginator, "Report");
...