1

我正在使用 aListView来显示一组项目,并且我正在分配这些项目,如下所示:

page.Items = _sampleData.Cats.Select(obj => (object) obj);

这很好用,每个Cat都显示在列表中。可重复地,如果我移除(object)演员表,并使用分配项目

page.Items = _sampleData.Cats.Select(obj => obj);

或者

page.Items = _sampleData.Cats;

然后,不是数据被正确存储,而是第一个的孩子显示列表中。这似乎……不直观?如果不是明确的,我在我的代码中是否遇到了一些执行不同的边缘情况,或者这种转换真的有影响吗? CatItemsobject

编辑:附加代码。

Cats是一个Cat对象列表:

public class Cat : IEnumerable<Trait>, IEnumerable
{
    public String Name;
    // getter and setter

    public List<Trait> Traits;
    // getter and setter

    public IEnumerator<Trait> GetEnumerator() {
        return Traits.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

ListView是一个 Metro UI 组件:

<ListView x:Name="CatListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...>

并且数据正在提供给我的一个课程中ListView的 setter :Items

private IEnumerable<object> _items;
public IEnumerable<object> Items
{
    get
    {
        return _items;
    }

    set
    {
        _items = value;
        CollectionViewSource.Source = value;
    }
}
4

1 回答 1

3

完成您正在做的事情的一种更简单的方法是使用Cast<>()

page.Items = _sampleData.Cats.Cast<object>();

(下面的原始答案,毕竟给出了评论,这不是那么有效。)

这是因为您不能将派生类的集合分配给基类的集合。

让我们把 LINQ 排除在外。page.Items是类型List<object>。假设以下将编译(它不会):

page.Items = _sampleData.Cats;

然后,请注意将继承自的任何内容object放入List<object>. 但是,在这种情况下,我们的对象列表实际上是 的列表Cat

因此,尝试以下操作会合乎逻辑,因为您似乎正在将 a 添加Banana到对象列表中,但该列表实际上是 Cats 列表。

var b = new Banana();
page.Items.Add(b);

你不能把 a 放在 aBananaList<Cat>

于 2011-12-16T02:25:39.870 回答