2013-08-16 3 views
0

Im, использующий datagrid, заполняющий itemsSource путем отражения (methodDefinition.Invoke (..)), целевой метод возвращает IQueryable < T>, где T является EntityType известных во время работы.Сортировка строк путем нажатия в заголовке столбца DataGrid с автогенерированными столбцами и IEnumerable ItemsSource

Поскольку возвращаемый тип IQueryable < T> и IQueryable < T> реализует IEnumerable, когда я делаю это:

dataGrid1.ItemsSource = methodQuery.Invoke(instance, parameters) as IEnumerable<object>; 

Im в состоянии видеть строк и столбцов (плюс событие AutoGeneratingColumns отбрасывается, так я могу управлять столбцами) , но я не смог сортировать строки, щелкнув по его заголовку.

Затем я попытался сделать это:

dataGrid1.ItemsSource = methodQuery.Invoke(instance, parameters) as List<object>; 

Но, как я ожидал, исключение брошено говорят, что я не могу напрямую бросить общий тип из «Model.Tab_001» до «объекта».

Кроме того, я попытался преобразовать результат в список < T> во время выполнения (посредством расширения IEnumerable.ToList(), создание делегата, который реализует FUNC, чтобы преобразовать источник в список < T>), но так как Т известен только во время выполнения, а объект (возвращающийся из метода methodDefinition.invoke) не может использовать расширение .ToList() без явного объявления типа T перед использованием этого метода.

@edit: Когда я использую этот метод с таким же IEnumerable < объекта> (который работает на сетке) и к методу расширения ToList(), то DataGrid становится заполнено пустыми строками плюс Его не стрельбой из AutoGeneratingColumns. Таким образом, я не смог увидеть результат, просто dataGrid, полный пустых строк.

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

Есть ли другой способ сортировки строк в datagrid, щелкнув заголовок столбца, используя List как ItemsSoure в datagrid?

ответ

0

я нашел более простой способ сделать это.

Вместо того, чтобы устанавливать dataGrid в AutoGenerateColumns, я устанавливаю идентификатор свойства в ItemsSource dataGrid, а затем заполняю его прямым приведением в объект IEnumerable <>, затем использует расширение ToList().

Всякий раз, когда меняют источник данных, я добавляю столбцы вручную, имея соответствующие заголовки и привязки.

Теперь я могу сортировать строки, щелкая по заголовку столбца.

Код:

... 
dataGrid1.ItemsSource = (IEnumerable<object>)methodQuery.Invoke(instance, parameters).ToList(); 
... 

...

private void DataGridItemsSourceChanged(object sender, EventArgs e) 
{ 
     var currentDataGrid = (DataGrid)sender; 

     foreach (TSpe_Reg reg in tabItemSourceChange.TSpe_Reg) // tabItemSourceChange is used to check the table and field names, since im using reflection. 
     { 
      string headerName = ""; 
      if (reg.a_short_name != "") 
       headerName = reg.a_short_name; 
      else 
       headerName = reg.a_full_name; 
      string boundColumn = "a_" + reg.a_field_name + "_" + tabItemSourceChange.a_table_name; 
      DataGridTextColumn ColumnDataGrid = new DataGridTextColumn { Header = headerName, Binding = new Binding(boundColumn) }; 

     } 
} 


// Calls the DataGridItemsSourceChanged whenever the DependencyProperty ItemsSource is changed. 
private void CallItemSourcePropertyDescriptor(DataGrid currentDataGrid) 
    { 
     var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid)); 
     if (dpd != null) 
     { 
      dpd.AddValueChanged(currentDataGrid, DataGridItemsSourceChanged); 
     } 
    } 
0

Почему бы не бросить первым, а затем преобразовать?

var ienum = (IEnumerable<object>)methodQuery.Invoke(instance, parameters); 
dataGrid1.ItemsSource = ienum.ToList(); 

(также использовать только as если вы проверяете для null впоследствии)

+0

Когда я делаю это я получаю DataGrid полный пустых строк, без столбцов (событие AutoGeneratingColumns не называется) –

+0

@ RafaelA.M.S .: Это печально. Я рекомендую вам проверить [это] (http://msdn.microsoft.com/en-us/library/ms745786.aspx) и [это] (http://msdn.microsoft.com/en-us /library/system.windows.data.collectionview.aspx) ... –