在 WPF FlowDocument 中重复数据绑定项

发布于 2024-08-08 23:19:44 字数 588 浏览 6 评论 0原文

我在 WPF 中有一个如下所示的流文档:

<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 属性的类,而是为其提供该类的列表,并让流文档显示其中每个对象。有人可以告诉我如何在流程文档中形成 XAML 来执行此操作吗?

I have a flowdocument in WPF that looks like this:

<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>

instead of giving the DataContext a class with the Title and AssignedTo property, I would like to give it a List of that class and have the flowdocument show each of them objects. Can someone tell me how to form the XAML in the flowdocument to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧伤还要旧人安 2024-08-15 23:19:44

谁知道呢,也许像下面的代码示例一样简单对您有用,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>

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

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>

希望这会有所帮助:)

Who knows, maybe as simple as the following code sample will work for you, 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>

If it's not, you can always create your own attached property and do whatever you can imagine inside property changed notification. Here is a small sample with Span control:

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>

Hope this helps :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文