2014-01-18 3 views
0

Я разрабатываю приложение, которое содержит много списков, каждое представление списка ограничено ObservableCollection, и каждая наблюдаемая коллекция содержит разные типы пользовательских объектов.Iterate over items for databounded WPF listview

Мне нужен метод, который принимает мой список в качестве параметра (независимо от того, какой тип объектов он хранит), и выполняет итерацию по своим элементам и ячейкам для записи данных в файл excel.

Я мог получить ListViewItem из ItemContainerGenerator, но я не мог перебирать столбцы. также я попытался получить GridViewRowPresenter, но я ничего не получил, потому что я дошел до точки, что я должен удалить свой объект с определенным типом данных.

+1

Почему бы не повторить ваш наблюдательный коллектив? Это должно быть намного проще. – LPL

+0

, когда я повторяю в коллекции, я должен отдать известному типу –

+0

, метод не может знать, какой тип объекта хранится в коллекции. –

ответ

0

В самой тривиальной модели вы можете использовать ListView.Items.SourceCollection в сочетании с Column.DisplayMemberPath, чтобы получить ссылку на объект привязки и свойство, которое вы должны печатать.

ListView lv = /* magically got a reference to the listview */; 
var collection = lv.Items.SourceCollection; 
var columns = ((GridView)lv.View).Columns; 

// I am assuming you already have an excel writer 
// write the headers 
excelWriter.StartRow(); 
foreach (var header in columns) 
{ 
    excelWriter.WriteCell(header.Header); 
} 
excelWriter.EndRow(); 

// get propertyinfo 
// this will fail if there are no items in the collection 
var tDataItem = collection.First().GetType(); 
// this will fail for anything but the most simple bindings 
var piColumns = columns.Select(c => tDataItem.GetProperty(((Binding)c.DisplayMemberBinding).Path)); 

// start data 
foreach (var dataitem in collection) 
{ 
    excelWriter.StartRow(); 
    foreach (var pi in piColumns) 
    { 
     var propValue = pi.GetValue(dataItem, null); 
     // given that this is of type object, you will probably have to format this 
     excelWriter.WriteCell(propValue); 
    } 
    excelWriter.EndRow(); 
} 

Другая модель, которую вы могли бы использовать, - try and read the cell values from the automation interface. Я знаю, что DataGrid поддерживает автоматизацию, но я не уверен в GridView.