Wpf FlowDocument到XPS-在DataGrid中丢失数据绑定

Wpf FlowDocument到XPS-在DataGrid中丢失数据绑定,wpf,flowdocument,xpsdocument,Wpf,Flowdocument,Xpsdocument,我已经用DataInded Datagrid创建了一个FlowDocument。 FlowDocumentScrollviewer中的输出如下: 接下来,我需要将此FlowDocument转换为固定文档(XPS),以便以A4纸张大小打印它但一旦我这样做,我的DataGrid数据就会丢失 这是我的XAML: <Window x:Class="Test_Flow.Izpisi.DataGrid_DataTable" xmlns="http://schemas.microsof

我已经用DataInded Datagrid创建了一个FlowDocument。 FlowDocumentScrollviewer中的输出如下:

接下来,我需要将此FlowDocument转换为固定文档(XPS),以便以A4纸张大小打印它但一旦我这样做,我的DataGrid数据就会丢失

这是我的XAML:

<Window x:Class="Test_Flow.Izpisi.DataGrid_DataTable"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_Flow.Izpisi"
        mc:Ignorable="d"
        Title="DataGrid_DataTable" Height="850" Width="850"
        WindowStartupLocation="CenterScreen">
      <Grid>
        <FlowDocumentScrollViewer Name="Flow_reader" >
            <FlowDocument Name="Flow_dokument" PageHeight="29.7cm" PageWidth="21cm" >
                <Paragraph>Datagrid with DataTable example</Paragraph>
                <BlockUIContainer>
                    <DataGrid BorderThickness="1" ItemsSource="{Binding Dt_Flow}" IsEnabled="False" 
                              AutoGenerateColumns="False" HeadersVisibility="Column" BorderBrush="Black">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Name" Binding="{Binding Number}"/>
                            <DataGridTextColumn Header="Surname" Binding="{Binding Surname}"/>
                            <DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
                            <DataGridTextColumn Header="City" Binding="{Binding City}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </BlockUIContainer>
            </FlowDocument>
        </FlowDocumentScrollViewer>
        <DocumentViewer Name="doc_viewer" Visibility="Collapsed" />
    </Grid>
</Window>
 class My_ViewModel : INotifyPropertyChanged
    {
        public My_ViewModel(DocumentViewer doc_viewer, FlowDocument dokument, FlowDocumentScrollViewer page_viewer)
        {
            Fill_Table(); //Fill some test data

            //Convert to XPS and display It in DocumentViewer
            Convert_to_XPS(doc_viewer, dokument, page_viewer);

        }

        public DataTable Dt_Flow { get; set; } //DataTable for FlowDocument

        private void Convert_to_XPS(DocumentViewer doc_viewer, FlowDocument dokument, FlowDocumentScrollViewer page_viewer)
        {
            //Convert FlowDocument to XPS
            MemoryStream ms = new MemoryStream();
            Package pkg = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);
            string pack = "pack://report.xps";
            PackageStore.RemovePackage(new Uri(pack));
            PackageStore.AddPackage(new Uri(pack), pkg);
            XpsDocument doc = new XpsDocument(pkg, CompressionOption.Maximum, pack);
            XpsSerializationManager rsm = new XpsSerializationManager(new XpsPackagingPolicy(doc), false);

            DocumentPaginator paginator = ((IDocumentPaginatorSource)dokument).DocumentPaginator;

            rsm.SaveAsXaml(paginator);

            //Hide FlowDocumentScrollViwer and show DocumentViewer
            page_viewer.Visibility = Visibility.Collapsed;
            doc_viewer.Document = doc.GetFixedDocumentSequence();
            doc_viewer.Visibility = Visibility.Visible;
        }

        private void Fill_table()
        {
            //Fill test table
            Dt_Flow = new DataTable();

            Dt_Flow.Columns.Add("Number");
            Dt_Flow.Columns.Add("Surname");
            Dt_Flow.Columns.Add("Address");
            Dt_Flow.Columns.Add("City");

            int my_number = 1;

            for (int i = 0; i < 10; i++)
            {
              DataRow _newRow = Dt_Flow.NewRow();
              _newRow["Number"] = my_number + ".";
              _newRow["Surname"] = "Johnson";
              _newRow["Address"] = "Beverly Hills";
              _newRow["City"] = "Los Angeles";

              Dt_Flow.Rows.Add(_newRow);
              my_number++;
            }
        }

        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion

    }

Datagrid和DataTable示例
和我的观点\u模型:

<Window x:Class="Test_Flow.Izpisi.DataGrid_DataTable"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_Flow.Izpisi"
        mc:Ignorable="d"
        Title="DataGrid_DataTable" Height="850" Width="850"
        WindowStartupLocation="CenterScreen">
      <Grid>
        <FlowDocumentScrollViewer Name="Flow_reader" >
            <FlowDocument Name="Flow_dokument" PageHeight="29.7cm" PageWidth="21cm" >
                <Paragraph>Datagrid with DataTable example</Paragraph>
                <BlockUIContainer>
                    <DataGrid BorderThickness="1" ItemsSource="{Binding Dt_Flow}" IsEnabled="False" 
                              AutoGenerateColumns="False" HeadersVisibility="Column" BorderBrush="Black">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Name" Binding="{Binding Number}"/>
                            <DataGridTextColumn Header="Surname" Binding="{Binding Surname}"/>
                            <DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
                            <DataGridTextColumn Header="City" Binding="{Binding City}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </BlockUIContainer>
            </FlowDocument>
        </FlowDocumentScrollViewer>
        <DocumentViewer Name="doc_viewer" Visibility="Collapsed" />
    </Grid>
</Window>
 class My_ViewModel : INotifyPropertyChanged
    {
        public My_ViewModel(DocumentViewer doc_viewer, FlowDocument dokument, FlowDocumentScrollViewer page_viewer)
        {
            Fill_Table(); //Fill some test data

            //Convert to XPS and display It in DocumentViewer
            Convert_to_XPS(doc_viewer, dokument, page_viewer);

        }

        public DataTable Dt_Flow { get; set; } //DataTable for FlowDocument

        private void Convert_to_XPS(DocumentViewer doc_viewer, FlowDocument dokument, FlowDocumentScrollViewer page_viewer)
        {
            //Convert FlowDocument to XPS
            MemoryStream ms = new MemoryStream();
            Package pkg = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);
            string pack = "pack://report.xps";
            PackageStore.RemovePackage(new Uri(pack));
            PackageStore.AddPackage(new Uri(pack), pkg);
            XpsDocument doc = new XpsDocument(pkg, CompressionOption.Maximum, pack);
            XpsSerializationManager rsm = new XpsSerializationManager(new XpsPackagingPolicy(doc), false);

            DocumentPaginator paginator = ((IDocumentPaginatorSource)dokument).DocumentPaginator;

            rsm.SaveAsXaml(paginator);

            //Hide FlowDocumentScrollViwer and show DocumentViewer
            page_viewer.Visibility = Visibility.Collapsed;
            doc_viewer.Document = doc.GetFixedDocumentSequence();
            doc_viewer.Visibility = Visibility.Visible;
        }

        private void Fill_table()
        {
            //Fill test table
            Dt_Flow = new DataTable();

            Dt_Flow.Columns.Add("Number");
            Dt_Flow.Columns.Add("Surname");
            Dt_Flow.Columns.Add("Address");
            Dt_Flow.Columns.Add("City");

            int my_number = 1;

            for (int i = 0; i < 10; i++)
            {
              DataRow _newRow = Dt_Flow.NewRow();
              _newRow["Number"] = my_number + ".";
              _newRow["Surname"] = "Johnson";
              _newRow["Address"] = "Beverly Hills";
              _newRow["City"] = "Los Angeles";

              Dt_Flow.Rows.Add(_newRow);
              my_number++;
            }
        }

        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion

    }
class My_ViewModel:INotifyPropertyChanged
{
公共My_ViewModel(DocumentViewer文档查看器、FlowDocument dokument、FlowDocumentScrollViewer页面查看器)
{
Fill_Table();//填充一些测试数据
//转换为XPS并在DocumentViewer中显示
转换成XPS(文档查看器、文档查看器、页面查看器);
}
公共数据表Dt_Flow{get;set;}//FlowDocument的数据表
私有void转换为XPS(DocumentViewer文档查看器、FlowDocument文档查看器、FlowDocumentScrollViewer页面查看器)
{
//将FlowDocument转换为XPS
MemoryStream ms=新的MemoryStream();
Package pkg=Package.Open(ms,FileMode.Create,FileAccess.ReadWrite);
字符串包=”pack://report.xps";
RemovePackage(新Uri(包));
AddPackage(新Uri(pack),pkg);
XpsDocument doc=新XpsDocument(包装,压缩选项。最大值,包装);
XpsSerializationManager rsm=新的XpsSerializationManager(新的XpsPackagingPolicy(doc),false);
DocumentPaginator paginator=((IDocumentPaginatorSource)dokument)。DocumentPaginator;
rsm.SaveAsXaml(paginator);
//隐藏FlowDocumentScrollViwer并显示DocumentViewer
page_viewer.Visibility=可见性.已折叠;
doc_viewer.Document=doc.GetFixedDocumentSequence();
doc_viewer.Visibility=可见性.Visibility;
}
专用空白填充表()
{
//填充测试表
Dt_Flow=新数据表();
Dt_流量列。添加(“编号”);
Dt_Flow.Columns.Add(“姓氏”);
Dt_Flow.Columns.Add(“地址”);
Dt_流量列。添加(“城市”);
int my_number=1;
对于(int i=0;i<10;i++)
{
DataRow_newRow=Dt_Flow.newRow();
_newRow[“Number”]=my_Number+”;
_纽罗[“姓氏”]=“约翰逊”;
_纽罗[“地址”]=“贝弗利山庄”;
_纽罗[“城市”]=“洛杉矶”;
Dt_Flow.Rows.Add(_newRow);
我的号码++;
}
}
#区域inotifyproperty已更改
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
#端区
}
为什么会发生这种情况,我该如何解决


编辑:我在“我的视图模型”中添加了“填充表格”方法,所以您可以自己测试整个过程

为了提供一些帮助,我需要延迟渲染,以便给数据绑定一个解决问题的机会。不过,我不知道如何在ViewModel中执行此操作。为了帮助您,我需要延迟渲染,以便数据绑定有机会解决此问题。但是,我不知道如何在ViewModel中执行此操作。