我正在使用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
,或者那个演员真的有所作为,那么我的代码中是否有一些边缘情况会有不同的表现?
修改:附加代码。
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
,虽然我的一个班级中的Items
设置了一个:
private IEnumerable<object> _items;
public IEnumerable<object> Items
{
get
{
return _items;
}
set
{
_items = value;
CollectionViewSource.Source = value;
}
}
答案 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>
。