Entwickler-Ecke
WPF / Silverlight - UserControl in XPS rendern --> Binding-Daten fehlen
UGrohne - Sa 21.03.09 12:29
Titel: UserControl in XPS rendern --> Binding-Daten fehlen
Hallo,
ich habe ein UserControl, das mir ein Dokument darstellt und per DataBinding mit Daten füllt. Dieses UserControl möchte ich nun genau so in ein XPS rendern lassen, mit folgendem Code funktioniert das eigentlich auch:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| Package pkg = Package.Open(@".\test.xps",FileMode.Create); XpsDocument xpsDoc = new XpsDocument(pkg); XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc); xpsWriter.Write(InvoiceContent); pkg.Close(); |
Wie gesagt, eigentlich funktioniert es, nur gehen sämtliche Daten verloren, die per DataBinding eingebunden wurden, ich bekomme also nur noch die Rohform des Dokuments.
Hat jemand einen Tipp für mich?
Danke im Voraus.
Kha - Sa 21.03.09 14:04
Das geht so einfach :shock: ? Wow, das muss ich mir merken.
Dein Problem kann ich leider nicht reproduzieren :( ;) .Mit deinem Code im Loaded-Handler und folgendem Minimal-XAML:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9:
| <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" DataContext="Foo" Loaded="Window_Loaded"> <ComboBox x:Name="InvoiceContent" SelectedIndex="0"> <ComboBoxItem Content="{Binding}" /> </ComboBox> </Window> |
Ich hoffe, das war nicht
zu minimal :( .
Edit: Mit
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <ComboBox x:Name="InvoiceContent"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" /> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> |
und
C#-Quelltext
1: 2:
| InvoiceContent.ItemsSource = new[] { "A", "B", "C" }; InvoiceContent.SelectedIndex = 0; |
funktioniert's ebenfalls.
UGrohne - Sa 21.03.09 17:31
Habs jetzt ein wenig verändert, dann funktionierts. Ich muss die Page manuell erzeugen und den DataContext zuweisen, weiß nicht genau, warum es bei Dir geht und bei mir nicht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Package pkg = Package.Open(@".\invoice.xps",FileMode.Create); XpsDocument xpsDoc = new XpsDocument(pkg); XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
FixedDocument fixedDoc = new FixedDocument(); PageContent pageContent = new PageContent(); FixedPage fixedPage = new FixedPage(); fixedPage.DataContext = this;
fixedPage.Children.Add(InvoiceContent); ((IAddChild)pageContent).AddChild(fixedPage); fixedDoc.Pages.Add(pageContent);
xpsWriter.Write(fixedDoc); pkg.Close(); |
Das größte Problem wird jetzt aber etwas Anderes: Ich muss meine Seitenumbrüche manuell vornehmen und da hab ich noch keine Ahnung, wie das funktionieren soll. Hab nur gehört, dass es mit einer von DocumentPaginator abgeleiteten Klasse funktionieren soll und ich dort eben meine eigene Logik einbauen muss. Wie ich das aber mit einer ListView über mehrere Seiten lösen soll, bin ich noch überfragt.
Aber das ist ein anderes Thema ;)
//EDIT: Ich glaube, ich weß, warum es bei Dir ging: Das Zuweisen des DataContexts hast Du unterhalb von Window vorgenommen und auf Window-Ebene wahrscheinlich drucken lassen? Ich habe aber ein Window, dem die Datenquelle zugewiesen ist (meine KLasse, MVVM lässt grüßen ;)) und darunter per ContentControl meinen InvoiceContent eingebunden und nur das ist der Teil, den ich drucke. Dieser erbt also den DataContext von oben, aber das funktioniert dann nicht mehr mit dem XpsWriter, weil die Hierarchie ja unterbrochen ist. Eigentlich logisch.
Im Endeffekt hab ich mir ein Preview gebaut und genau das lass ich drucken, funktioniert richtig gut, wer braucht da noch Reporting-Komponenten? ;)
Kha - Sa 21.03.09 18:36
UGrohne hat folgendes geschrieben : |
| Das Zuweisen des DataContexts hast Du unterhalb von Window vorgenommen und auf Window-Ebene wahrscheinlich drucken lassen? |
Darauf habe ich doch sogar extra geachtet :P : Es wird Window.DataContext gesetzt, aber nur die ComboBox gedruckt.
Den Fehler kann ich mir immer noch nicht erklären, aber was soll's ;) .
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!