将XamDataGrid的FieldLayout应用于多个动态网格

时间:2014-10-22 11:20:26

标签: c# wpf infragistics xamdatagrid

我希望能够将单个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应用于所有这些

1 个答案:

答案 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。