在WPF FlowDocument中重复数据绑定项

时间:2009-10-23 21:14:43

标签: wpf flowdocument

我在WPF中有一个如下所示的flowdocument:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Paragraph FontFamily="Georgia">
        <StackPanel>
            <TextBlock Text="{Binding Path=Title}"/>
            <TextBlock Text="{Binding Path=AssignedTo}"/>
        </StackPanel>
    </Paragraph>
</FlowDocument>

而不是给DataContext一个带有Title和AssignedTo属性的类,我想给它一个该类的List,并让flowdocument显示每个对象。有人能告诉我如何在flowdocument中形成XAML来做到这一点吗?

1 个答案:

答案 0 :(得分:9)

谁知道,也许就像下面的代码示例一样简单,Ajma:

<Window x:Class="WpfTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfTest="clr-namespace:WpfTest"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
    Title="Bound Inlines Sample" Height="300" Width="300">
  <Window.Resources>
    <Collections:ArrayList x:Key="array">
      <System:String>Hello</System:String>
      <System:String>World</System:String>
      <System:String>!</System:String>
    </Collections:ArrayList>
  </Window.Resources>
  <Grid>
    <FlowDocumentReader>
      <FlowDocument>
        <Paragraph FontFamily="Georgia">
            <ItemsControl ItemsSource="{StaticResource array}"/>            
        </Paragraph>
      </FlowDocument>
    </FlowDocumentReader>
  </Grid>
</Window>

如果不是,您可以随时创建自己的附加属性,并在属性更改通知中执行您可以想象的任何操作。这是一个带有跨度控制的小样本:

<强> CS:

public class SpanOperations : DependencyObject
{
  public static IEnumerable GetInlineSource(DependencyObject obj)
  {
    return (IEnumerable)obj.GetValue(InlineSourceProperty);
  }

  public static void SetInlineSource(DependencyObject obj, IEnumerable value)
  {
    obj.SetValue(InlineSourceProperty, value);
  }

  public static readonly DependencyProperty InlineSourceProperty =
      DependencyProperty.RegisterAttached("InlineSource", typeof(IEnumerable), typeof(SpanOperations), new UIPropertyMetadata(null, OnInlineSourceChanged));

  private static void OnInlineSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
    var span  = d as Span;
    if (span == null)
    {
      // It's a demo only. Can work with only spans... 
      return;
    }
    span.Inlines.Clear();

    var inlines = e.NewValue as IEnumerable;
    if (inlines != null)
    {
      foreach (var inline in inlines)
      {
        // We assume only inlines will come in collection:
        span.Inlines.Add(inline as Inline);
      }

    }
  }
}

<强> XAML

<Window x:Class="WpfTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfTest="clr-namespace:WpfTest"
    xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
    Title="Bound Inlines Sample" Height="300" Width="300">
  <Window.Resources>
    <Collections:ArrayList x:Key="array">
      <Run>Hello</Run>
      <LineBreak/>
      <Run>Hello</Run>
      <LineBreak/>
      <Bold>
        <Run>Hello</Run>
      </Bold>
    </Collections:ArrayList>
  </Window.Resources>
  <Grid>
    <FlowDocumentReader>
      <FlowDocument>
        <Paragraph FontFamily="Georgia">
          <Span WpfTest:SpanOperations.InlineSource="{Binding Source={StaticResource array}}"/>
        </Paragraph>
      </FlowDocument>
    </FlowDocumentReader>
  </Grid>
</Window>

希望这会有所帮助:)