gpt4 book ai didi

wpf - 在数据绑定(bind)流文档中插入分隔符(空白行)

转载 作者:行者123 更新时间:2023-12-03 10:15:10 25 4
gpt4 key购买 nike

在我的 MVVM WPF 应用程序中,我使用的是数据绑定(bind)流文档。我使用了 here 描述的技术能够将我的数据绑定(bind)到流文档。
我的流文档绑定(bind)到我的 View 模型中的公共(public)属性。该属性是自定义类型的可枚举,如下所示:

public IEnumerable<Person> Persons
{
get { return _persons; }
set { _persons = value; }
}

流文档显示在 FlowDocumentScrollViewer 控件中。该文档如下所示:
code    name    lastname
---- ----- ---------
1 john johnson
1 peter peterson
2 jane jane
3 john doe

绑定(bind)工作正常,但是我想在每个不同的代码之后添加一个空行:
code    name    lastname
---- ----- ---------
1 john johnson
1 peter peterson

2 jane jane

3 john doe

我在 View 中的 Xaml 是:
<FlowDocumentScrollViewer>
<FlowDocument>
<flowdoc:ItemsContent ItemsSource="{Binding Path=Persons}">
<flowdoc:ItemsContent.ItemsPanel>
<DataTemplate>
<flowdoc:Fragment>
<Table BorderThickness="1" BorderBrush="Black">
<TableRowGroup flowdoc:Attached.IsItemsHost="True">
<TableRow Background="LightBlue">
<TableCell>
<Paragraph>ronde</Paragraph>
</TableCell>
<TableCell>
<Paragraph>hal</Paragraph>
</TableCell>
<TableCell>
<Paragraph>datum</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
</Table>
</flowdoc:Fragment>
</DataTemplate>
</flowdoc:ItemsContent.ItemsPanel>
<flowdoc:ItemsContent.ItemTemplate>
<DataTemplate>
<flowdoc:Fragment>
<TableRow>
<TableCell>
<Paragraph>
<flowdoc:BindableRun BoundText="{Binding Path=Code}" />
</Paragraph>
</TableCell>
<TableCell>
<Paragraph>
<flowdoc:BindableRun BoundText="{Binding Path=Name}" />
</Paragraph>
</TableCell>
<TableCell>
<Paragraph>
<flowdoc:BindableRun BoundText="{Binding Path=LastName}" />
</Paragraph>
</TableCell>
</TableRow>
</flowdoc:Fragment>
</DataTemplate>
</flowdoc:ItemsContent.ItemTemplate>
</flowdoc:ItemsContent>


关于如何在不违反 MVVM 规则的情况下执行此操作的任何建议?似乎对流文档进行数据绑定(bind)的代价是布局不灵活。

提前致谢

最佳答案

为了对您的数据进行分组,请使用 CollectionViewSource像这样:

<Window.Resources>
<CollectionViewSource x:Key="groupView" Source="{Binding Path=Persons}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Code"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<FlowDocumentScrollViewer>
<FlowDocument>
<flowdoc:ItemsContent ItemsSource="{Binding Source={StaticResource groupView}}">
....
</flowdoc:ItemsContent>
</FlowDocument>
</FlowDocumentScrollViewer>
</Grid>
CollectionViewSource上面的元素对 Persons 进行排序按代码列出并确定组。

此外,您必须调整 ItemsContent类,因为 MSDN 文章中的那个还不支持分组。这是一个非常简单的示例,您可以如何实现这一目标:

private void GenerateContent(DataTemplate itemsPanel, DataTemplate itemTemplate, IEnumerable itemsSource)
{
Blocks.Clear();
if (itemTemplate != null && itemsSource != null)
{
FrameworkContentElement panel = null;

if (panel == null)
{
if (itemsPanel == null)
{
panel = this;
}
else
{
FrameworkContentElement p = Helpers.LoadDataTemplate(itemsPanel);
if (!(p is Block))
{
throw new Exception("ItemsPanel must be a block element");
}
Blocks.Add((Block)p);
panel = Attached.GetItemsHost(p);
if (panel == null)
{
throw new Exception("ItemsHost not found. Did you forget to specify Attached.IsItemsHost?");
}
}
}

// *** START NEW CODE ***
ICollectionView view = itemsSource as ICollectionView;
if (view != null)
{
foreach (object group in view.Groups)
{
GenerateContentForUngroupedItems(itemsPanel, itemTemplate, ((CollectionViewGroup)group).Items, panel);
if (panel is TableRowGroup)
{
TableRow row = new TableRow();
row.Cells.Add(new TableCell());
((TableRowGroup)panel).Rows.Add(row);
}
}
}
else
{
GenerateContentForUngroupedItems(itemsPanel, itemTemplate, itemsSource, panel);
}
// *** END NEW CODE ***
}
}

private void GenerateContentForUngroupedItems(DataTemplate itemsPanel, DataTemplate itemTemplate,
IEnumerable itemsSource, FrameworkContentElement panel)
{
foreach (object data in itemsSource)
{
FrameworkContentElement element = Helpers.LoadDataTemplate(itemTemplate);
element.DataContext = data;
Helpers.UnFixupDataContext(element);
if (panel is Section)
{
((Section) panel).Blocks.Add(Helpers.ConvertToBlock(data, element));
}
else if (panel is TableRowGroup)
{
((TableRowGroup) panel).Rows.Add((TableRow) element);
}
else
{
throw new Exception(String.Format("Don't know how to add an instance of {0} to an instance of {1}",
element.GetType(), panel.GetType()));
}
}
}

上面的大部分代码来自原始 MSDN 文章;我所做的唯一更改是:
  • 移动了foreach循环到新方法 GenerateContentForUngroupedItems .
  • 将面板创建代码(“if (panel==null)”)移到循环之外。
  • 添加了标记为 NEW CODE 的代码.

  • 修改后的代码的作用是:如果项目源不是 Collection View ,它的工作方式与原始 MSDN 代码完全相同。如果项目源是 Collection View ,则调用两个嵌套循环:
  • 外部循环遍历所有组。
  • 内部循环遍历当前组中的所有项目。

  • 内部循环实际上与 MSDN 文章中的原始 foreach 循环相同。

    在上面添加的代码中,空表行由以下几行添加:

    TableRow row = new TableRow();
    row.Cells.Add(new TableCell());
    ((TableRowGroup)panel).Rows.Add(row);

    当然,这段代码不是很通用。对于通用解决方案,将新的依赖属性添加到 ItemsContent包含数据模板的控件,就像 ItemsPanelItemTemplate特性。然后,您可以在组的末尾插入任意文本。

    结果如下所示:

    Grouped flow document

    关于wpf - 在数据绑定(bind)流文档中插入分隔符(空白行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11334297/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com