См. этот вопрос .
Я думаю, у вас есть два варианта
- Использование ItemsControl
- Использование вложенного свойства
Обновление
Более динамическое решение с использованием двух прикрепленных свойств.Ресурс с шаблоном добавляется в абзац (для которого должен быть установлен атрибут x:Shared="False"
, в противном случае мы будем просто добавлять одни и те же элементы снова и снова).Затем список источников и имя ресурса шаблона устанавливаются как прикрепленные свойства.
В обратном вызове PropertyChanged выполняется проверка того, что оба свойства установлены, а затем для каждого элемента в элементе создается элемент Span
.список.Элементы span DataContext
устанавливаются на текущий элемент, чтобы привязки работали
<FlowDocumentReader xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib">
<FlowDocument>
<Paragraph behaviors:ParagraphInlineBehavior.ParagraphInlineSource="{Binding MyList}"
behaviors:ParagraphInlineBehavior.TemplateResourceName="inlineTemplate">
<Paragraph.Resources>
<Collections:ArrayList x:Shared="False" x:Key="inlineTemplate">
<Bold>
<Run Text="{Binding Title}"/>
</Bold>
<LineBreak/>
<Run Text="{Binding FlowText}"/>
<LineBreak/>
</Collections:ArrayList>
</Paragraph.Resources>
</Paragraph>
</FlowDocument>
</FlowDocumentReader>
ParagraphInlineBehavior
public class ParagraphInlineBehavior : DependencyObject
{
public static readonly DependencyProperty TemplateResourceNameProperty =
DependencyProperty.RegisterAttached("TemplateResourceName",
typeof(string),
typeof(ParagraphInlineBehavior),
new UIPropertyMetadata(null, OnParagraphInlineChanged));
public static string GetTemplateResourceName(DependencyObject obj)
{
return (string)obj.GetValue(TemplateResourceNameProperty);
}
public static void SetTemplateResourceName(DependencyObject obj, string value)
{
obj.SetValue(TemplateResourceNameProperty, value);
}
public static readonly DependencyProperty ParagraphInlineSourceProperty =
DependencyProperty.RegisterAttached("ParagraphInlineSource",
typeof(IEnumerable),
typeof(ParagraphInlineBehavior),
new UIPropertyMetadata(null, OnParagraphInlineChanged));
public static IEnumerable GetParagraphInlineSource(DependencyObject obj)
{
return (IEnumerable)obj.GetValue(ParagraphInlineSourceProperty);
}
public static void SetParagraphInlineSource(DependencyObject obj, IEnumerable value)
{
obj.SetValue(ParagraphInlineSourceProperty, value);
}
private static void OnParagraphInlineChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Paragraph paragraph = d as Paragraph;
IEnumerable inlines = ParagraphInlineBehavior.GetParagraphInlineSource(paragraph);
string templateName = ParagraphInlineBehavior.GetTemplateResourceName(paragraph);
if (inlines != null && templateName != null)
{
paragraph.Inlines.Clear();
foreach (var inline in inlines)
{
ArrayList templateList = paragraph.FindResource(templateName) as ArrayList;
Span span = new Span();
span.DataContext = inline;
foreach (var templateInline in templateList)
{
span.Inlines.Add(templateInline as Inline);
}
paragraph.Inlines.Add(span);
}
}
}
}