我试图完成与这个问题所问的相同的任务,特别是这个答案,但我正在winui3中工作(特别是我正在使用CommunityToolkit DataGrid),并且似乎没有任何与WPF 的 ItemTemplate。 有什么办法可以做到这一点吗?
解释一下:我正在使用许多不同的数据源,其中至少有一个是数据虚拟化的(使用这种技术)。 数据本身非常简单——只是一个结构的可枚举。 但我需要做两件事:
所以,我认为执行这些操作的最佳位置是在 DataGrid 中,使用 WPF ItemTemplate 之类的东西
我得出的结论是,我遇到的是两个不同的问题。 我分别解决了。
首先,根据传入的数据向表中添加列:我发现可以在代码隐藏中设置一个事件,每次添加新行时都会调用该事件。 花了一些时间才让它工作,但是:
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 生命周期的知识。我也学到了很多关于它们调试起来有多么困难!)