在列表上使用Select()方法

时间:2011-12-16 01:05:13

标签: c# listview microsoft-metro

我正在使用ListView来显示项目集合,我正在分配这些项目:

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

效果很好,每个Cat都会显示在列表中。重复,如果我删除(object)强制转换,并使用

分配项目
page.Items = _sampleData.Cats.Select(obj => obj);

page.Items = _sampleData.Cats;

然后,代替正确存储的数据, first Cat children 将显示在列表中。这似乎......不直观?如果Items没有明确地object,或者那个演员真的有所作为,那么我的代码中是否有一些边缘情况会有不同的表现?

修改:附加代码。

CatsCat个对象的列表:

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,虽然我的一个班级中的Items设置了一个:

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

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

1 个答案:

答案 0 :(得分:3)

实现目标的一种简单方法是使用Cast<>()

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

(下面的原始答案,在给出评论之后不是那么有效。)

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

让我们把LINQ排除在外。 page.Items的类型为List<object>。假设以下内容将编译(它没有):

page.Items = _sampleData.Cats;

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

因此,尝试以下操作在逻辑上可以解决,因为看起来您正在向对象列表添加Banana,但该列表实际上是Cats列表。

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

您无法将Banana放入List<Cat>