2011-01-06 16 views
8

böyle benim ViewModel bağlı şeyler içeren bir FlowDocument vardır:Bir FlowDocument Listesinde bir liste bağlama <MyClass>?

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

Şimdi DataTemplate çeşit kullanarak sınıfın bir Listesi'ni görüntülemek istiyorum, ama nasıl başlamak için hiçbir fikrim yok.

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

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

Ve ben böyle, FlowDocument Listesine bu bağlamak istiyorum: - ama bulamıyorum

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

Bu işe yaramazsa Tabi ki böyle bir sınıf var ki Şablonları kullanarak bir FlowDocument içinde Listeler bağlama herhangi bir açıklama - bu mümkün mü?

cevap

6

Bkz. this question.

Sana iliştirilmiş bir özellik

Güncelleme
iki ekli özelliklerini kullanarak daha dinamik çözüm kullanma ItemsControl

  • Kullanılması iki seçenek
    • var. Şablon ile bir Kaynak Paragraf'a eklenmiştir (x:Shared="False" öznitelik kümesine sahip olmalıdır, aksi takdirde aynı öğeleri tekrar tekrar eklemeye devam edeceğiz). Ardından Kaynak Listesi ve şablon kaynağının adı ekli özellikler olarak ayarlanır.

      PropertyChanged geri aramada, her iki özelliğin ayarlandığını ve sonra Listedeki her öğe için bir Span öğesinin oluşturulduğunu bir kontrol yapılır. Binding'lerini yapmak geçerli madde olarak ayarlanır DataContext yayılma elemanları

      <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 güzel olurdu, bu FlowDocument hala karışım içinde düzenlenebilir kullanarak acaba

      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

    çalışır. – Sam

    +0

    @Sam: "Paragraf" a "Kalın", "Çalıştır" vb. Eklemeyi mi yoksa genellikle Blend'de bir "FlowDocument" ile nasıl çalışıyorsunuz? Ben hiç yapmadım :) –

    +1

    Özellikle ekli özellikleri çalıştırıldığında Kaynaklar özelliği henüz doldurulmadığı için bu çözüm ile ilgili sorunlar yaşıyor gibi görünmektedir, bu yüzden –

    İlgili konular