2014-01-18 81 views
0

我正在開發一個應用程序,其中包含許多listviews,每個listview綁定到一個ObservableCollection,並且每個可觀察集合擁有不同的自定義對象類型。迭代項目數據綁定WPF列表視圖

我需要一個方法,它將我的listview作爲參數(不管它包含什麼類型的對象),並遍歷其項目和單元格以將數據寫入excel文件。

我可以從ItemContainerGenerator獲取ListViewItem,但是我無法遍歷列。另外我試圖得到GridViewRowPresenter,但我什麼都沒有,因爲我達到了一個點,我必須將我的對象取消裝箱到一個特定的數據類型。

+1

爲什麼不迭代ObservableCollection?這應該更容易。 – LPL

+0

當我迭代集合時,我必須將其轉換爲已知類型 –

+0

該方法無法知道集合所持有的對象的類型。 –

回答

0

在最普通的模型中,您可以使用ListView.Items.SourceCollectionColumn.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