更新!
装订工作。问题是 XpsDocumentWriter 没有正确写入 FixedDocumentSequence 的第一个文档的第一页。这似乎是很多人在做这种事情时遇到的问题(即全球有五个开发人员)。解决方案有点奇怪。我把它作为一个答案。
好的,它比问题所暗示的要微妙一些。
我有一系列 FixedPages,每个都有其 DataContext 单独设置。每个 FixedPage 还具有一个或多个绑定到上下文的控件。
如果我将这些 FixedPages 添加到单个 FixedDocument 并将此单个 FixedDocument 写入 XpsDocument,我的绑定将被取消引用(可以这么说)并且正确的值会显示在 XpsDocument 中。
如果我将这些 FixedPages 添加到各个 FixedDocuments(每个 FP 被添加到一个新的 FD),然后这些 FixedDocuments 被添加到一个 FixedDocumentSequence,然后这个序列被写入 XpsDocument,我的绑定不会被取消引用并且我的 FixedPages 显示为空白.
调试告诉我我没有丢失我的绑定或我的绑定上下文,所以这不是这个失败的原因。
下面是一些示例代码来说明发生了什么:
// This works
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create an xps document and write my fixed document to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fd);
p.Flush();
p.Close();
// This does NOT work
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();
您可以看到两者之间的唯一区别是我将固定文档添加到固定文档序列中,然后将其写入。
显然,当我的固定文档未写入 Xps 文档时,不会发生任何导致评估数据绑定和插入绑定值的魔法。我需要能够编写多个固定文档,并且 Write 方法只能调用一次,因此需要我将 FixedDocuments 添加到我然后编写的 FixedDocumentSequence 中。但我也需要我该死的数据绑定才能工作!
在这种情况下的任何帮助将不胜感激。我知道它不完全是框架中最常见的部分。我只是希望这里有人对此有一些操作经验(我在看着你,潜伏着 MS 员工)。