Winui3:有没有办法转换用作 ItemsSource 的集合的成员

问题描述 投票:0回答:1

我试图完成与这个问题所问的相同的任务,特别是这个答案,但我正在winui3中工作(特别是我正在使用CommunityToolkit DataGrid),并且似乎没有任何与WPF 的 ItemTemplate。 有什么办法可以做到这一点吗?

解释一下:我正在使用许多不同的数据源,其中至少有一个是数据虚拟化的(使用这种技术)。 数据本身非常简单——只是一个结构的可枚举。 但我需要做两件事:

  • 我可能需要向表中添加更多列,为此我需要整个可枚举;
  • 可枚举中的每一项都显示在一个单元格中,该单元格还包含一个或多个显示一些附加信息的下拉菜单,我需要在视图模型中保留下拉菜单的状态。为了生成该状态,我需要来自该列的信息。

所以,我认为执行这些操作的最佳位置是在 DataGrid 中,使用 WPF ItemTemplate 之类的东西

datagrid winui-3 itemtemplate windows-community-toolkit
1个回答
0
投票

我得出的结论是,我遇到的是两个不同的问题。 我分别解决了。

首先,根据传入的数据向表中添加列:我发现可以在代码隐藏中设置一个事件,每次添加新行时都会调用该事件。 花了一些时间才让它工作,但是:

public MyUserControl () {
    InitializeCOmponent();
    myTableView.LoadingRow += onLoadingRow;
    // ... other setup
}

private void onLoadingRow (object sender, DataGridRowEventArgs e) {
    var item = e.Row.DataContext as MyItemType;
    if (item != null) {
        var dispatcherQueue = DispatcherQueue.TryEnqueue ( () => {
            // add additional columns here, if still required
        });
    }
}

有必要通过调度程序,因为如果在处理行时添加一列,则会从

DataGridCellCollection
的深度尝试测量尚不存在的列而产生错误。 基本上,您必须在看到必须容纳的数据之后才添加列。 但这意味着:要小心! 如果连续添加多行,则所有添加的列都会排队等待稍后添加。 在添加列之前,您应该检查您是否确实需要它。

其次,在数据转换器中使用列数据:当我向表中添加列时,我可以通过转换器将我得到的项目转换为我想要的类型。 当然,转换器不知道它位于哪一列,但可以将提供该知识的参数(提供给转换器)添加到绑定中。 (在我的例子中,我提供了一个描述下拉列表的枚举。)问题是:当您添加列时,您仍然可以看到整个数据源及其任何参数化,因此通过在列生成时创建绑定,您可以传递任何您想要的附加上下文。 (我不得不承认,通过这个我学到了很多关于 Binding 生命周期的知识。我也学到了很多关于它们调试起来有多么困难!)

© www.soinside.com 2019 - 2024. All rights reserved.