我希望能够将单个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>
当我输入我的第一个类型名称并渲染网格时,此FieldLayout按预期使用;一切都很好。但是,下次输入类型名称并渲染网格时,根本不应用FieldLayout - 显示所有内容,包括我想隐藏的字段。我已经尝试通过在代码隐藏中处理网格的AssigningFieldLayoutToItem事件来强制网格使用FieldLayout,如下所示:
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模式,因此理想情况下要保持我的代码隐藏,但如果解决方案需要一些代码隐藏,我当然愿意尝试(因为我已经。)< / p>
谢谢!
tl; dr 我在运行时换出并渲染新的网格,并且需要将相同的FieldLayout应用于所有这些
答案 0 :(得分:1)
Infragistics支持回复了我。可疑,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。