2014-10-22 3 views
0

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

ответ

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 должен быть создан с каждой новой сетью в любом случае.