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