Применение FieldLayout XamDataGrid к нескольким динамическим сеткам

Я хотел бы иметь возможность применять один FieldLayout к нескольким сеткам, которые динамически создаются во время выполнения.

В моем приложении я использую панель поиска для ввода имени типа, и когда тип найден, сетка отображает все экземпляры этого типа на сервере. Затем пользователь должен иметь возможность искать другой тип и, таким образом, заменять сетку новой.

Я устанавливаю для AutoGenerateFields в FieldLayoutSettings значение 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 вообще не применяется — отображается все, включая поля, которые я хочу скрыть. Я попытался заставить сетку использовать FieldLayout, обработав событие сетки AssigningFieldLayoutToItem в коде следующим образом:

    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, который мне нужен в качестве ресурса для моего UserControl, установив x:Shared="False", чтобы его можно было повторно использовать, и добавив его в код программной части следующим образом:

    MyGrid.FieldLayouts.Add(this.Resources["FieldLayout"] as FieldLayout);

По сути, это оставляет меня с тем же поведением, что и исходная проблема - макет применяется к первой сетке, а затем больше не используется для последующих сеток. Комбинация двух вышеупомянутых решений оставляет меня с вышеупомянутой проблемой сетки, отображающей неправильные поля.

Я просто хотел бы, чтобы одни и те же правила в существующем FieldLayout применялись к каждой визуализируемой сетке. Любая помощь приветствуется!

Я пытаюсь следовать шаблону MVVM, поэтому в идеале хотел бы сохранить мой код программной части чистым, но если для решения требуется немного кода программной части, я, конечно, готов попробовать (как я уже сделал).

Спасибо!

tl;dr Я заменяю и отображаю новые сетки во время выполнения, и мне нужно применить один и тот же FieldLayout ко всем из них.


person Ben    schedule 22.10.2014    source источник


Ответы (1)


Поддержка Infragistics ответила мне. Как и предполагалось, FieldLayout становится связанным с типом, к которому он привязан при создании, поэтому его нельзя повторно использовать таким образом. Вместо того, чтобы создавать FieldLayout в xaml и пытаться использовать его повторно, одним из возможных решений является избавление от FieldLayout из xaml и обработка события FieldLayoutInitialized в xamDataGrid и скрытие свойств таким образом:

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 с каждой новой сеткой.

person Ben    schedule 22.10.2014