1

私は次のように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); 
            } 
        } 
    } 
}
4

0 に答える 0