2011-01-06 4 views
8

나는 이런 식으로 내 뷰 모델에 바인딩 재료를 포함하는 FlowDocument 있습니다FlowDocument의 목록을 List <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> 

이 작동하지 않습니다 물론 내가 같은 클래스를 가지고 말 템플릿을 사용하여 FlowDocument의 List를 바인딩하는 방법에 대한 설명 - 이것이 가능합니까?

답변

6

this question을 참조하십시오.

난 당신이 연결된 속성

업데이트
이 연결된 속성을 사용하여보다 동적 솔루션을 사용하여 ItemsControl에

  • 를 사용하여 두 가지 옵션
    • 을 가지고 생각합니다. 템플리트가있는 자원이 단락에 추가됩니다 (이 속성은 x:Shared="False" 속성 집합이어야 함). 그렇지 않으면 동일한 요소를 반복해서 계속 추가합니다. 그런 다음 소스 목록과 템플릿 리소스의 이름이 첨부 된 속성으로 설정됩니다.

      PropertyChanged 콜백에서 두 속성이 모두 설정되어 있는지 확인한 다음 List에있는 각 항목에 대해 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에게 사랑이 될 것이다, 이것을 Flowdocument 여전히 조화를 편집 할 수 있습니다 사용하는 경우 궁금

      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

    작동합니다. – Sam

    +0

    @Sam : "Bold", "Run"등을'Paragraph'에 추가하는 것과 같은 뜻입니까, 아니면 보통 Blend에서'FlowDocument'를 어떻게 사용합니까? 난 한번도 해본 적이 없어 :) –

    +1

    첨부 된 속성을 실행할 때 특히이 솔루션에 문제가있는 것 같습니다. 리소스 속성이 아직 채워지지 않아 "인라인 템플릿"리소스가 없습니다. –

    관련 문제