Я хотел бы иметь возможность применить один FieldLayout к нескольким сеткам, которые динамически создаются во время выполнения.Применение FieldLayout XamDataGrid к нескольким динамическим сеткам
В моем приложении я использую строку поиска для ввода имени типа, и когда тип найден, сетка будет отображать все экземпляры этого типа на сервере. Затем пользователь должен иметь возможность искать другой тип и тем самым заменять сетку новой.
Я устанавливаю 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 становится связанным с отображаемыми полями.
Я также попытался добавить FieldLayout я требую как ресурс для моего UserControl, установив x:Shared="False"
так, что он может быть использован повторно, и добавить его в коде-за так:
MyGrid.FieldLayouts.Add(this.Resources["FieldLayout"] as FieldLayout);
Это по существу листья меня с тем же поведением, что и исходная проблема - макет применяется к первой сетке, а затем больше не используется для последующих сеток. Комбинация двух вышеперечисленных решений оставляет мне проблему с сеткой, отображающую неправильные поля.
Мне бы хотелось, чтобы те же правила в существующем поле FieldLayout применялись к каждой сетке, которая визуализируется. Любая помощь приветствуется!
Я пытаюсь следовать шаблону MVVM, поэтому я хотел бы, чтобы мой код был чистым, но если для решения требуется немного кода, я, конечно же, захочу попробовать (как и я уже).
Спасибо!
Т.Л., д-р я поменять и сделать новые сетки во время выполнения, и необходимо применять те же FieldLayout ко всем из них