私は次のようにViewModelにバインドされたものを含むFlowDocumentを持っています(これはインターネットから取得します):
public class Foo
{
public string Text { get; set; }
}
public MainWindow()
{
InitializeComponent();
List<Foo> foos = new List<Foo>();
for (int i = 0; i < 20; i++) {
foos.Add(new Foo() { Text = i.ToString() });
}
this.DataContext = foos;
}
そして、私はFlowDocumentに私のリストfoosをバインドしようとしています。
<FlowDocumentReader>
<FlowDocument>
<Paragraph behaviors:ParagraphInlineBehavior.ParagraphInlineSource="{Binding}"
behaviors:ParagraphInlineBehavior.TemplateResourceName="inlineTemplate">
<Paragraph.Resources>
<DataTemplate x:Key="inlineTempalte">
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</Paragraph.Resources>
</Paragraph>
</FlowDocument>
</FlowDocumentReader>
そして、このクラス、私がインターネットから取得するParagraphInlineBehaviorですが、私はまだ私の目的を達成していません。(フロードキュメントにデータテンプレートを表示します)。
OnParagraphInlineChangedメソッドに問題があります。
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);
}
}
}
}