WPF。无法转换类型的对象

时间:2011-08-21 14:58:41

标签: c# wpf

大家好我有收藏:

public class ActionData
{
    private int iD;

    public int ID 
    {
        get { return iD; }
        set { iD = value; }
    }
    private string roomType;

    public string RoomType 
    {
        get { return roomType; }
        set { roomType = value; }
    }
}
像这样

private void btnGridToExcel_Click(object sender, RoutedEventArgs e)
{
    ExportExcel<ActionData, ActionDatas> exp = new ExportExcel<ActionData, ActionDatas>();
    exp.GenerateReport();
    ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
    exp.dataToPrint = (ActionDatas)view.SourceCollection;
    exp.GenerateReport(); 
}

在此按钮上单击必须将数据导出到Excel,但我在exp.dataToPrint = (ActionDatas)view.SourceCollection;上发出错误:

  

无法将类型为'System.Collections.ObjectModel.ObservableCollection`1 [H_Pro.Logicstic + ActionData]'的对象强制转换为'ActionDatas'。

以下是获取值的方法的一部分

 public class ActionDatas : List<ActionData> { }

        #region toxls
         public class ExportExcel<T, U>
        where T : class
        where U : List<T>
    {
        public List<T> dataToPrint;

有没有人知道为什么会出现这样的错误?

1 个答案:

答案 0 :(得分:2)

来自ActionDatas的数据可能被隐式地分配给SourceCollection(可能在XAML中),这是一个ObservableCollection&lt;&gt; (与List&lt;&gt;不同)。它是一个ObservableCollection是一件好事,因为集合更改将自动通知侦听WPF UI。

您应该能够简单地分配一个ActionDatas,并传输元素:

exp.dataToPrint = new ActionDatas();

foreach(ActionData data in view.SourceCollection) {
    exp.dataToPrint.Add(data);
}

或类似的东西。

更新:如果你的datagrid ItemsSource已经是一个ActionDatas对象,那么你应该将它直接分配给dataToPrint成员,不需要将它放在视图中然后转回到新的集合中。