Существует ли эквивалент ItemsControl для текстового контента?

StackOverflow https://stackoverflow.com/questions/1254633

Вопрос

У меня есть некоторые данные, которые я хочу представить в виде 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( по каждому предмету.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top