在 UWP 运行 时间重新生成 DataGrid 列
re-generate DataGrid columns at run time in UWP
我在 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; }
我在 运行 时间内需要 'replace' 网格。所有 "available grids"(比如说总共 10 个网格)都是预定义的; ViewModel.PresentColumns 每 "available grid" 在 运行 时生成。我想在 运行 期间重新生成列。所有可用列的数据模板都在全局资源中预定义。
它可行还是有另一种架构解决方案?
在 UserControl 中保留很少的网格是不可取的。
那是 DataGrid 表单 Windows 社区工具包 - ns Microsoft.Toolkit.Uwp.UI.Controls。
初始任务是:从 VM 动态生成 DataGrid 列; MS DataGrid 的约束 - 属性 名称,定义网格列必须在编译时定义。
我有 Class Foo 和 100 个属性。 Foo 的集合是 DataGrid 的 ItemsSource。每个 属性 都是自定义对象并在网格中定义列。全局资源中的每个 属性 都有 DataTemplate 用于网格中的表示数据。我需要在一个视图中显示不同的属性组,从 VM 立即切换组。
我看到以下解决方法:
1.瞬间're-generate'只是网格(有疑问)
2. Wrapp grid in UserControl, load-unload UserControl, 每次都会强制生成新的网格(可行)。
3.Generate 包含所有 100 列和 hide/show 列的网格(可行,不可取)。
其实我意识到我正在寻找触发AutoGeneratingColumn事件的方法;更改 ItemsSource 属性 适用于此任务。因此,我打算 'artificially' 更改 VM 中的源代码。我认为您的评论是对我的问题的回答。谢谢你,巴里。
经楼主确认。 OP 想要寻找触发 AutogeneratingColumn 事件的方法。这已写在 the official doc 中。您可以在哪里看到以下内容:
"The AutoGeneratingColumn event occurs one time for each public, non-static property in the bound data type when the ItemsSource property is changed and the AutoGenerateColumns property is true."
我在 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; }
我在 运行 时间内需要 'replace' 网格。所有 "available grids"(比如说总共 10 个网格)都是预定义的; ViewModel.PresentColumns 每 "available grid" 在 运行 时生成。我想在 运行 期间重新生成列。所有可用列的数据模板都在全局资源中预定义。 它可行还是有另一种架构解决方案? 在 UserControl 中保留很少的网格是不可取的。
那是 DataGrid 表单 Windows 社区工具包 - ns Microsoft.Toolkit.Uwp.UI.Controls。 初始任务是:从 VM 动态生成 DataGrid 列; MS DataGrid 的约束 - 属性 名称,定义网格列必须在编译时定义。 我有 Class Foo 和 100 个属性。 Foo 的集合是 DataGrid 的 ItemsSource。每个 属性 都是自定义对象并在网格中定义列。全局资源中的每个 属性 都有 DataTemplate 用于网格中的表示数据。我需要在一个视图中显示不同的属性组,从 VM 立即切换组。 我看到以下解决方法: 1.瞬间're-generate'只是网格(有疑问) 2. Wrapp grid in UserControl, load-unload UserControl, 每次都会强制生成新的网格(可行)。 3.Generate 包含所有 100 列和 hide/show 列的网格(可行,不可取)。
其实我意识到我正在寻找触发AutoGeneratingColumn事件的方法;更改 ItemsSource 属性 适用于此任务。因此,我打算 'artificially' 更改 VM 中的源代码。我认为您的评论是对我的问题的回答。谢谢你,巴里。
经楼主确认。 OP 想要寻找触发 AutogeneratingColumn 事件的方法。这已写在 the official doc 中。您可以在哪里看到以下内容:
"The AutoGeneratingColumn event occurs one time for each public, non-static property in the bound data type when the ItemsSource property is changed and the AutoGenerateColumns property is true."