C# 应用XamDataGrid';多个动态网格的FieldLayout

C# 应用XamDataGrid';多个动态网格的FieldLayout,c#,wpf,infragistics,xamdatagrid,C#,Wpf,Infragistics,Xamdatagrid,我希望能够将单个FieldLayout应用于多个网格,这些网格是在运行时动态创建的 在我的应用程序中,我使用搜索栏键入一个类型名称,当找到一个类型时,网格将显示服务器上该类型的所有实例。然后,用户应该能够搜索不同的类型,从而用新的网格替换网格 我正在将FieldLayoutSettings中的AutoGenerateFields设置为true,因为在运行时之前我不知道要显示的类型,并且字段在不同类型之间会有所不同。但是,我知道它们将共享一些我不希望在网格上显示的字段(因为它们都扩展了相同的抽象类

我希望能够将单个FieldLayout应用于多个网格,这些网格是在运行时动态创建的

在我的应用程序中,我使用搜索栏键入一个类型名称,当找到一个类型时,网格将显示服务器上该类型的所有实例。然后,用户应该能够搜索不同的类型,从而用新的网格替换网格

我正在将FieldLayoutSettings中的AutoGenerateFields设置为true,因为在运行时之前我不知道要显示的类型,并且字段在不同类型之间会有所不同。但是,我知道它们将共享一些我不希望在网格上显示的字段(因为它们都扩展了相同的抽象类)。因此,我使用的FieldLayout如下所示:

    <igDP:XamDataGrid x:Name="MyGrid" DataSource="{Binding Items}" >
        <igDP:XamDataGrid.FieldLayoutSettings>
            <igDP:FieldLayoutSettings AutoGenerateFields="True"/>
        </igDP:XamDataGrid.FieldLayoutSettings>
        <igDP:XamDataGrid.FieldLayouts>
            <igDP:FieldLayout IsDefault="True">
                <igDP:Field Name="PropertyToNotDisplay" Visibility="Collapsed"/>
                <igDP:Field Name="AnotherPropertyToNotDisplay" Visibility="Collapsed"/>
            </igDP:FieldLayout>
        </igDP:XamDataGrid.FieldLayouts>
    </igDP:XamDataGrid>
    private void MyGrid_OnAssigningFieldLayoutToItem(object sender, AssigningFieldLayoutToItemEventArgs e)
    {
        e.FieldLayout = MyGrid.FieldLayouts[0];
    }
虽然这会应用布局,但不会更改网格上的字段

为了说明发生了什么:如果类型A有字段1、2、3,而类型B有字段2、3、4-当显示类型B时,它将显示所有类型B实例的网格,但有类型A的字段-这当然没有意义,并且缺少一些数据。最后我们得到一个包含字段1、2、3的网格,“1”列中的所有单元格都是空的

因此,当创建网格并应用fieldlayout时,fieldlayout将与显示的字段耦合

我还尝试添加我需要的FieldLayout作为我的UserControl的资源,设置
x:Shared=“False”
,以便可以重用,并将其添加到代码中,如下所示:

    MyGrid.FieldLayouts.Add(this.Resources["FieldLayout"] as FieldLayout);
这基本上使我的行为与原始问题相同-布局应用于第一个网格,然后不再用于后续网格。以上两种解决方案的结合使我面临上述网格显示错误字段的问题

我只希望将现有FieldLayout中的相同规则应用于渲染的每个网格。任何帮助都将不胜感激

我正试图遵循MVVM模式,因此理想情况下我希望保持代码的整洁,但如果解决方案需要一些代码,我当然愿意尝试(正如我已经尝试过的那样)

谢谢


tl;dr我在运行时交换并渲染新网格,并且需要对所有网格应用相同的FieldLayout

基础设施支持得到了回复。正如所怀疑的,FieldLayout在创建时与它绑定到的类型相关联,因此不能以这种方式重用它。与其在xaml中创建FieldLayout并尝试重用它,一种可能的解决方案是从xaml中删除FieldLayout,并处理xamDataGrid上的
FieldLayoutInitialized
事件,并以这种方式隐藏属性:

private void MyGrid_FieldLayoutInitialized(object sender, Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs e) 
{
    var fld = e.FieldLayout.Fields.FirstOrDefault(f => f.Name.Equals("PropertiesToOldValues"));
    if (fld != null) fld.Visibility = Visibility.Collapsed;
    fld = e.FieldLayout.Fields.FirstOrDefault(f => f.Name.Equals("MagnetoProperty"));
    if (fld != null) fld.Visibility = Visibility.Collapsed;
}
更高的开销,但无论如何都需要使用每个新网格创建一个新的FieldLayout