Существует ли эквивалент элемента ItemsControl для текстового содержимого? - PullRequest
6 голосов
/ 10 августа 2009

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

Ответы [ 3 ]

9 голосов
/ 11 августа 2009

То, что вы ищете, возможно, но требует значительного количества кодирования. К счастью, Винсент Ван Ден Берге опубликовал на MSDN хорошую статью, в которой описывается, как создавать гибкие интерфейсы пользователя с потоковыми документами и привязкой данных , включая код!

0 голосов
/ 11 августа 2009

Я думаю, что вы ищете элемент списка: 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( для каждого элемента.

0 голосов
/ 11 августа 2009

Вместо использования FlowDocument вы можете использовать ItemsControl и изменить панель, используемую для отображения элементов, на WrapPanel . Это позволит вам использовать ItemsControl по своему усмотрению, но изменить его семантику отображения на WrapPanel (который, я считаю, работает как FlowDocument. Вы бы сделали это примерно так:

<ItemsControl>
    <ItemsControl.ItemsPanelTemplate>
        <WrapPanel />
    </ItemsControl.ItemsPanelTemplate>
</ItemsControl>

Вы можете установить любые свойства внутреннего WrapPanel по своему желанию.

...