迭代数据包WPF listview的项目

时间:2014-01-18 20:42:09

标签: wpf listview

我正在开发一个包含许多列表视图的应用程序,每个listview都绑定到一个ObservableCollection,每个可观察的集合都包含不同的自定义对象类型。

我需要一个方法,将listview作为参数(无论它包含什么类型的对象),并迭代其项目和单元格以将数据写入excel文件。

我可以从ItemContainerGenerator获取ListViewItem,但我无法迭代列。我也试图获得GridViewRowPresenter,但我什么都没有,因为我达到了一个点,我必须将我的对象解包到特定的数据类型。

1 个答案:

答案 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