c# - 在 UWP 中运行时重新生成 DataGrid 列
问题描述
我在 UWP 应用程序中使用 MVVM 模式。VM 定义了一个 DataGrid 列的列表。我使用以下代码隐藏在 UserControl 加载期间生成列:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (ViewModel.PresentColumns.Contains(e.PropertyName.ToLower()))
{
var templateName = e.PropertyName + "DataTemplate";
var templateColumn = new DataGridTemplateColumn();
templateColumn.CellTemplate = Application.Current.Resources[templateName] as DataTemplate;
templateColumn.Header = e.PropertyName;
e.Column = templateColumn;
}
else
{
e.Cancel = true;
}
}
XAML:
<msgrid:DataGrid Name="GridTargets" Grid.Row="1"
Grid.Column="0"
ItemsSource="{x:Bind ViewModel.TargetSteps}"
SelectedItem="{x:Bind ViewModel.SelectedTargetStep, Mode=TwoWay}"
AutoGenerateColumns="True"
GridLinesVisibility="All"
CanUserResizeColumns="False"
AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"/>
虚拟机:
public IEnumerable<string> PresentColumns { get; private set; }
我需要在运行时“替换”网格。所有“可用网格”(假设总共 10 个网格)都是预定义的;ViewModel.PresentColumns 在运行时为每个“可用网格”生成。我认为在运行期间重新生成列。所有可用列的数据模板都在全局资源中预定义。它是可行的还是有另一种架构解决方案?在 UserControl 中保留少量网格是不可取的。
那是 Windows 社区工具包中的 DataGrid - ns Microsoft.Toolkit.Uwp.UI.Controls。初始任务是:从 VM 动态生成 DataGrid 列;MS DataGrid 的约束 - 定义网格列的属性名称必须在编译时定义。我有 Foo 类有 100 个属性。Foo 的集合是DataGrid 的ItemsSource。每个属性都是一个自定义对象并定义网格中的列。全局资源中的每个属性都有 DataTemplate,用于网格中的表示数据。我需要在一个视图中显示不同的属性组,组立即从 VM 切换。我看到以下解决方法: 1. 立即“重新生成”网格(有问题) 2. 在 UserControl 中包装网格,加载-卸载 UserControl,这将强制每次生成新网格(可行)。3.
实际上我意识到我正在寻找触发 AutoGeneratingColumn 事件的方法;更改 ItemsSource 属性适用于此任务。因此,我将“人为”更改 VM 中的源。我认为您的评论是对我问题的回答。谢谢巴里。
解决方案
经原海报确认后。OP 想寻找触发 AutogeneratingColumn 事件的方法。这已写在官方文档中。您可以在其中看到以下内容:
“当 ItemsSource 属性更改且 AutoGenerateColumns 属性为 true 时,对于绑定数据类型中的每个公共非静态属性,AutoGeneratingColumn 事件发生一次。”
推荐阅读
- python - 如何在 Python 中将文本标签添加到 Plotly 散点图中?
- android - 安卓工作室;将 .title 和 .snippet 信息添加到 ArrayList
- google-sheets - 对银行对账单行进行排序的公式
- html - 在网页中显示 360 度图像
- javascript - Javascript从锚点克隆文本并添加到同一锚点的属性
- python-3.x - 如何在需要在 Python 中创建新列的特定 Pandas 列上应用函数
- python - 如果输入值大于 input_dim,keras 嵌入层如何工作?
- java - Java:创建对象并直接添加到 ArrayList - 两种方式
- c# - 如何在 SSIS 中获得 C# 转换以允许我输出 null
- amazon-web-services - Eventbridge 和 SQS fifo 队列