Gibt es ein ItemsControl -Äquivalent für Textinhalte?
-
12-09-2019 - |
Frage
Ich habe einige Daten, die ich in a präsentieren möchte FlowDocument
. Dies ist im Grunde eine Ansicht, die die Daten freundlich erklärt, mit Abschnittsüberschriften, Textabsätzen usw. und die ich in einem FlowDocumentsCrollViewer anzeigen werde.
Zu diesem Zweck möchte ich eine Kugelliste erstellen (<List>
) aus dem Inhalt eines ObservableCollection
. Ich weiß, wie man das macht ItemsControl
, aber wie mache ich das für ListItem
Elemente in a FlowDocument
, da sie Teil der sind TextElement
Klassenhierarchie eher als die Control
Hierarchie? Gibt es ein Äquivalent von ItemsControl
Für Textinhalte in a TextBlock
oder FlowDocument
?
Bearbeiten: Das Artikel Sergey, mit dem verknüpft ist, ist der perfekte Ausgangspunkt. Das einzige Problem ist, dass der Code des Artikels nur a verwenden kann Section
oder ein TableRowGroup
als Element -Panel und unterstützt noch nicht mit a <List>
. Aber das war trivial zu beheben - nur eine Frage des Hinzufügens dieses Code am Ende von ItemsContent.GenerateContent
, kurz vor dem Finale else
:
else if (panel is List)
((List) panel).ListItems.Add((ListItem) element);
Lösung
Was Sie suchen, ist möglich, erfordert jedoch eine erhebliche Menge an Codierung. Glücklicherweise hat Vincent van den Berghe einen schönen Artikel über die MSDN veröffentlicht, in der beschrieben wird, wie es geht Erstellen Sie flexible Benutzeroberflächen mit Durchflussdokumenten und Datenbindung , einschließlich des Code!
Andere Tipps
Anstatt a zu verwenden FlowDocument
, Sie können eine verwenden ItemsControl
und ändern Sie das für die angezeigte Panel, mit dem Elemente auf a angezeigt werden Wrappanel. Dadurch können Sie die verwenden ItemsControl
Wie Sie möchten, aber ändern Sie seine Anzeigesemantik in a WrapPanel
(was ich glaube, funktioniert wie a FlowDocument
. Du würdest es so etwas machen:
<ItemsControl>
<ItemsControl.ItemsPanelTemplate>
<WrapPanel />
</ItemsControl.ItemsPanelTemplate>
</ItemsControl>
Sie können alle Eigenschaften auf das Innere festlegen WrapPanel
wie du willst.
Ich denke, Sie suchen nach dem Listenelement:http://msdn.microsoft.com/en-us/library/system.windows.documents.list.aspx
Bubblewrap weist auf ein paar weitere Details hin. Sie würden wahrscheinlich an die ListItems -Eigenschaft binden und müssen mit einem Wertschöpfungsversorter Ihre Quellliste in eine Liste der Typ -ListItemScollection konvertieren.
BubbleWrap weist darauf hin, dass dies readonly ist und dass die ListItemScollection einen internen Konstruktor hat. So...
Ich denke, was Sie tun müssten, ist Folgendes:
<ContentControl Content="{Binding TheArrayOfText, Converter={StaticResource StringsToListConverter}" />
Das ist ziemlich unglücklich, aber ich denke, es würde funktionieren. Sie müssten einen Konverter schreiben, um ein neues Listenobjekt zu erstellen und anzurufen .Add(
auf jedem Artikel.