Yoh*_*hyo 5 .net c# generics collections wpf
对于我的 WPF 应用程序,我需要 CollectionViewSource 来在集合中启用选择、筛选、排序和分组。但 CollectionViewSource 不是像 IList 那样的类型安全集合,例如属性 View.CurrentItem 是一个对象。如果我们使用它们,我们需要铸造它们。
是否有任何支持 Generic 的 CollectionViewSource 替代方案?或者也许有人知道 CollectionViewSource 不是泛型的原因?
=============================
我基于标准 CollectionViewSource 制作了一个通用 CollectionViewSource。对于它是否是在 XAML 之外实例化的集合类的更好替代方案,有什么评论吗?或者还有其他更好的选择?
编辑1:添加通用CollectionViewSource
namespace Data
{
using System.Collections.Generic;
using System.Linq;
using System.Windows.Data;
public class CollectionViewSource<T> : CollectionViewSource
{
public T CurrentItem => this.View != null ? (T)this.View.CurrentItem : default(T);
public new IEnumerable<T> Source
{
get
{
return (IEnumerable<T>)base.Source;
}
set
{
base.Source = value;
}
}
public IEnumerable<T> ViewItems => this.View != null ? Enumerable.Cast<T>(this.View) : (IEnumerable<T>)null;
public CollectionViewSource(IEnumerable<T> source)
{
this.Source = source;
}
public bool Contains(T item)
{
return this.View != null && this.View.Contains(item);
}
public IEnumerable<T> Groups()
{
return this.View.Groups.Cast<T>();
}
public void MoveCurrentTo(T item)
{
this.View?.MoveCurrentTo(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它不通用的原因是类型安全应该在您的底层集合中而不是您的视图中。
CollectionViewSource 纯粹用于格式化数据的显示,因此就像组合和列表控件一样,CollectionViewSource 也不需要键入,并且出于完全相同的原因,因为它们需要使用提供给它们的任何内容
例如,您有一个学生集合,您希望以组合方式显示它,但您还希望能够选择“新学生”,新学生不是学生,因此无法添加到学生集合中,但它是完全有效的组合项,因此虽然底层集合必须是类型安全的,但在组合上强制执行相同的操作是限制性的而不是保护性的,在您的视图之外,您的代码实际上不应该关心值是否已排序,这通常只是人类事物
至于你的通用 CollectionViewSource,这取决于你如何使用它(如果它是一个好主意),但类型安全应该是多余的,因为你的底层集合应该已经这样做了。
我建议将 anObservableCollection<T>作为 CollectionViewSource 的源,然后忘记类型保护显示
| 归档时间: |
|
| 查看次数: |
2423 次 |
| 最近记录: |