是否有与文本内容等效的ItemsControl?

时间:2009-08-10 12:39:56

标签: wpf data-binding itemscontrol flowdocument

我想要在FlowDocument中提供一些数据。这基本上是一个以友好的方式解释数据的视图,包括节标题,文本段落等,我将在FlowDocumentScrollViewer中显示。

为此,我想从<List>的内容中创建项目符号列表(ObservableCollection)。我知道如何使用ItemsControl执行此操作,但如何对ListItem中的FlowDocument元素执行此操作,因为它们属于TextElement类层次结构而非Control层次结构? ItemsControlTextBlock内的文字内容是否等同FlowDocument


编辑: article谢尔盖链接到的是一个完美的起点。唯一的问题是文章的代码只能使用SectionTableRowGroup作为项目面板,并且还不支持使用<List>。但这很容易解决 - 只需在ItemsContent.GenerateContent末尾添加此代码,就在最终else之前:

else if (panel is List)
    ((List) panel).ListItems.Add((ListItem) element);

3 个答案:

答案 0 :(得分:9)

您正在寻找的是可能的,但需要大量的编码。幸运的是,Vincent Van Den Berghe在MSDN上发表了一篇很好的文章,描述了如何Create Flexible UIs With Flow Documents And Data Binding,包括代码!

答案 1 :(得分:0)

您可以使用FlowDocument而不是使用ItemsControl,并将用于显示项目的面板更改为WrapPanel。这将允许您根据需要使用ItemsControl,但将其显示语义更改为WrapPanel(我认为它的功能类似于FlowDocument。您可以这样做:< / p>

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

您可以根据需要在内部WrapPanel设置任何属性。

答案 2 :(得分:0)

我认为您正在寻找List元素: http://msdn.microsoft.com/en-us/library/system.windows.documents.list.aspx

Bubblewrap指出了一些细节。您可能绑定到ListItems属性,需要使用ValueConverter将源列表转换为ListItemsCollection类型的列表。

Bubblewrap指出这是readonly并且ListItemsCollection有一个内部构造函数。所以......

我认为你必须要做的是:

<ContentControl Content="{Binding TheArrayOfText, Converter={StaticResource StringsToListConverter}" />

这非常不幸,但我认为它会奏效。您必须编写转换器来创建新的List对象,并在每个项目上调用.Add(