在运行时在UWP

时间:2018-10-14 17:57:07

标签: c# uwp-xaml

我在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"/>

VM:

  public IEnumerable<string> PresentColumns { get; private set; }

我需要在运行时“替换”网格。所有“可用网格”(假设总共10个网格)都是预定义的;在运行时为每个“可用网格”生成ViewModel.PresentColumns。我认为要在运行期间重新生成列。在全局资源中预定义了所有可用列的DataTemplates。 是可行的,还是有另一种架构解决方案? 不希望在UserControl中保留几个网格。

这是Windows社区工具包中的DataGrid-ns Microsoft.Toolkit.Uwp.UI.Controls。 初始任务是:从VM动态生成DataGrid列; MS DataGrid的约束-属性名称,用于定义网格列的必须在编译时定义。 我有100个属性的Foo类。 Foo的集合是DataGrid的ItemsSource。每个属性都是一个自定义对象,并在网格中定义列。全局资源中的每个属性都有DataTemplate,用于表格中的表示数据。我需要在一个视图中显示不同的属性组,组可以从VM立即切换。 我看到以下工作环境: 1.立即“重新生成”仅网格(有问题的) 2.在UserControl中封装Wrapp网格,加载/卸载UserControl,这将每次都强制生成新网格(可行)。 3.生成具有全部100列的网格,并根据VM的要求隐藏/显示列(可行,不理想)。

实际上,我意识到我正在寻找触发AutoGeneratingColumn事件的方式。更改ItemsSource属性可用于此任务。因此,我将“人为地”更改VM中的源。我认为您的评论是对我问题的回答。谢谢巴里。

1 个答案:

答案 0 :(得分:0)

在原始海报上确认后。 OP希望寻找触发AutogeneratingColumn事件的方式。这已写在the official doc中。您可以在其中看到以下内容:

“当ItemsSource属性更改并且AutoGenerateColumns属性为true时,绑定数据类型中的每个公共非静态属性都会发生一次AutoGeneratingColumn事件。”