Существует ли эквивалент ItemsControl для текстового контента?
-
12-09-2019 - |
Вопрос
У меня есть некоторые данные, которые я хочу представить в виде FlowDocument
.По сути, это будет представление, объясняющее данные в удобной форме, с заголовками разделов, абзацами текста и т. д., и которое я буду отображать в FlowDocumentScrollViewer.
С этой целью я хотел бы создать маркированный список (<List>
) из содержимого ObservableCollection
.Я знаю, как это сделать с ItemsControl
, но как мне это сделать ListItem
элементы в FlowDocument
, поскольку они являются частью TextElement
иерархия классов, а не Control
иерархия?Есть ли эквивалент ItemsControl
для текстового содержимого внутри TextBlock
или FlowDocument
?
Редактировать: А статья Ссылка на Сергея является идеальной отправной точкой.Единственная проблема заключается в том, что код статьи может использовать только Section
или TableRowGroup
в качестве панели элементов и пока не поддерживает использование <List>
.Но это было легко исправить — достаточно добавить этот код в конец ItemsContent.GenerateContent
, незадолго до финала else
:
else if (panel is List)
((List) panel).ListItems.Add((ListItem) element);
Решение
То, что вы ищете, возможно, но требует значительного объема кода.К счастью, Винсент Ван Ден Берге опубликовал в MSDN хорошую статью, описывающую, как Создавайте гибкие пользовательские интерфейсы с помощью Flow Documents и привязки данных , включая код!
Другие советы
Вместо использования FlowDocument
, вы можете использовать ItemsControl
и измените панель, используемую для отображения элементов, на ОбернутьПанель.Это позволит вам использовать ItemsControl
как хотите, но измените семантику его отображения на WrapPanel
(который, я считаю, функционирует как FlowDocument
.Вы бы сделали это примерно так:
<ItemsControl>
<ItemsControl.ItemsPanelTemplate>
<WrapPanel />
</ItemsControl.ItemsPanelTemplate>
</ItemsControl>
Вы можете установить любые свойства на внутренней WrapPanel
как вы желаете.
Я думаю, вы ищете элемент List:http://msdn.microsoft.com/en-us/library/system.windows.documents.list.aspx
Bubblewrap указывает на еще несколько деталей.Скорее всего, вы привяжетесь к свойству ListItems и вам понадобится использовать ValueConverter для преобразования исходного списка в список типа ListItemsCollection.
Bubblewrap указывает, что это доступно только для чтения и что ListItemsCollection имеет внутренний конструктор.Так...
Я думаю, что вам нужно сделать следующее:
<ContentControl Content="{Binding TheArrayOfText, Converter={StaticResource StringsToListConverter}" />
Это очень прискорбно, но я думаю, что это сработает.Вам придется написать преобразователь для создания нового объекта List и вызвать .Add(
по каждому предмету.