Я хотел бы иметь возможность применять один 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 ко всем из них.