2011-01-06 13 views
8

मैं एक FlowDocument इस तरह मेरी ViewModel करने के लिए बाध्य सामान से युक्त है:<MyClass> सूची के लिए फ़्लो डॉक्यूमेंट में एक सूची बाध्यकारी?

<FlowDocumentReader> 
    <FlowDocument> 
    <Paragraph> 
     <Run Text="{Binding MyTextProperty}"/> 
    </Paragraph> 
    </FlowDocument> 
</FlowDocumentReader> 

अब मैं DataTemplate किसी तरह का उपयोग कर वर्ग के एक सूची प्रदर्शित करना चाहते हैं, लेकिन कैसे शुरू करने के लिए पता नहीं मिला है।

public MyClass 
{ 
    String Title {get;set;} 
    String FlowText {get;set;} 
} 

public List<MyClass> MyList {get;set;} 

और मैं इस तरह FlowDocument सूची को यह बाध्य करने के लिए, चाहते हैं:: - लेकिन मैं नहीं मिल सकता है

<FlowDocumentReader> 
    <FlowDocument> 
    <List Items="{Binding MyList}"> 
     <Bold><Run Text="{Binding Title}"/></Bold> 
     <LineBreak/> 
     <Run Text="{Binding FlowText}"/> 
    </Paragraph> 
    </FlowDocument> 
</FlowDocumentReader> 

बेशक यह काम नहीं करता मैं एक वर्ग की तरह मिल गया कहो टेम्पलेट का उपयोग करके फ्लो डॉक्यूमेंट में सूचियों को कैसे बांधना है, यह कोई स्पष्टीकरण है - क्या यह संभव है?

उत्तर

6

this question देखें।

मुझे लगता है कि आपके पास दो विकल्प

  • एक ItemsControl
  • का उपयोग करते हुए एक संलग्न संपत्ति

अद्यतन
एक अधिक गतिशील समाधान दो संलग्न गुण का उपयोग कर का उपयोग कर सकते है। टेम्पलेट के साथ एक संसाधन पैराग्राफ में जोड़ा गया है (जिसमें x:Shared="False" विशेषता सेट होना चाहिए, अन्यथा हम वही तत्वों को बार-बार जोड़ते रहेंगे)। फिर स्रोत सूची और टेम्पलेट संसाधन का नाम संलग्न गुणों के रूप में सेट किया गया है।

प्रॉपर्टी चेंज कॉलबैक में, एक चेक किया जाता है कि दोनों गुण सेट किए गए हैं और फिर 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); 
      } 
     } 
    } 
} 
+0

मुझे आश्चर्य है अगर उपयोग करते हुए इस FlowDocument अभी भी मिश्रण में संपादित किया जा सकता है, जो सुंदर हो जाएगा। – Sam

+0

@ सैम: क्या आपका मतलब है "बोल्ड", "रन" इत्यादि को 'पैराग्राफ' में जोड़ना या आप आमतौर पर ब्लेंड में 'फ्लो डॉक्यूमेंट' के साथ कैसे काम करते हैं? मैंने इसे कभी नहीं किया है :) –

+1

मुझे इस समाधान के साथ समस्याएं आ रही हैं, खासकर जब संलग्न गुण चलाए जाते हैं संसाधन संपत्ति अभी तक पॉप्युलेट नहीं हुई है, इसलिए –

संबंधित मुद्दे