【发布时间】:2018-10-17 11:49:16
【问题描述】:
我在 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 Community Toolkit 中的 DataGrid - ns Microsoft.Toolkit.Uwp.UI.Controls。 初始任务是:从 VM 动态生成 DataGrid 列; MS DataGrid 的约束 - 定义网格列的属性名称必须在编译时定义。 我有 Foo 类有 100 个属性。 Foo 的集合是DataGrid 的ItemsSource。每个属性都是一个自定义对象并定义网格中的列。全局资源中的每个属性都有 DataTemplate,用于网格中的表示数据。我需要在一个视图中显示不同的属性组,组立即从 VM 切换。 我看到以下解决方法: 1.立即“重新生成”网格(有问题) 2.在UserControl中包裹网格,加载-卸载UserControl,每次都会强制生成新的网格(可行)。 3.生成包含所有 100 列的网格,并根据 VM 隐藏/显示列(可行,不可取)。
其实我意识到我正在寻找触发 AutoGeneratingColumn 事件的方法;更改 ItemsSource 属性适用于此任务。因此,我将“人为”更改 VM 中的源。我认为您的评论是对我问题的回答。谢谢巴里。
【问题讨论】:
-
不清楚您要做什么。这个数据网格是否意味着社区工具包数据网格?为什么需要在运行时重新生成列?您有自己的数据网格数据吗?有任何 MCVE[stackoverflow.com/help/mcve] 来帮助我们理解您的请求吗?
-
我似乎理解你所说的在运行时生成的意思。但是您的问题“重新生成网格”仍然让我感到困惑。你的意思是重新模板化数据网格的外观。或者你的意思是一个组来分组你的列?当 ItemsSource 属性更改时,将触发该事件。不过好像不会改源码吧?
-
感谢您的确认。我将发布有关该事件的答案。顺便说一句,我看到您是新用户的通知。因此,下次如果您进行编辑,您可以添加以下内容: 编辑以通知其他人您正在编辑您的原始帖子。这将使您的帖子更加清晰。