是否有任何CollectionViewSource替代Generic?

时间:2016-10-24 10:15:21

标签: c# .net wpf generics collections

对于我的WPF应用程序,我需要CollectionViewSource来启用集合中的选择,过滤,排序和分组。但CollectionViewSource不是类似IList的类型安全集合,属性View.CurrentItem是一个对象。如果我们使用它们,我们需要投射它们。

是否有支持Generic的CollectionViewSource替代品? 或者也许有人知道CollectionViewSource不是通用的原因吗?

=============================

我基于标准的CollectionViewSource创建了一个通用的CollectionViewSource。 是否是在XAML之外实例化的集合类的更好的替代品?还是有另一个更好的选择?

编辑1:添加Generic CollectionViewSource

 export default function(state={inputs:[ ]}, action) {
        console.log(action.index);
        switch (action.type) {
        case APPEND_INPUT:
            return { ...state, inputs: state.inputs.concat({value:"",key:"1",type:'input'})};
        case APPEND_TEXTAREA:
            return { ...state, inputs: state.inputs.concat({value:"",key:"",type:'textarea'})};
        case APPEND_EMAIL:
            return { ...state, inputs: state.inputs.concat({value:"",key:"",type:'email'})};
        case REMOVE_INPUT:
            return  {inputs: state.inputs.slice(0)};

        default:
            return state;
        }
    }

2 个答案:

答案 0 :(得分:1)

其不通用的原因是类型安全应该在您的基础集合中而不是您的视图。

CollectionViewSource纯粹用于格式化数据的显示,所以就像组合和列表控件一样,也没有输入CollectionViewSource,并且出于完全相同的原因,因为它们需要处理给予它们的任何东西

作为一个例子,你有一个学生集合,你想在一个组合中显示这个,但你也希望能够选择“新学生”新学生不是学生所以不能添加到学生集合但是是一个完全有效的组合项,所以虽然底层集合必须是类型安全的,但在组合上强制执行同样的限制而不是保护,在你的视图外面你的代码真的不应该关心值是否排序通常只是一个人的事情

至于你的通用CollectionViewSource,它取决于你如何使用它,如果它是一个好主意,但类型安全应该是超级的,因为你的底层集合应该已经这样做了。

我建议您使用ObservableCollection<T>作为CollectionViewSource的来源,然后忘记输入显示的类型

答案 1 :(得分:0)

您实际上可以只绑定到您的ObservableCollection(或任何集合),然后为该集合实例调用CollectionViewSource.GetDefaultView,然后应用过滤器,您的DataGrid(或其他项目控件)将被过滤。这样你就可以吃蛋糕了:-)

我怀疑这是因为WPF列表控件从未真正绑定到普通的.NET集合,而是总是在幕后调用CollectionViewSource.GetDefaultView,并且似乎返回与您已经存在的实例相同的实例。创建,如果您创建了一个。

隐藏代码:

MySourceCollection = new[]
{
    new ViewModel(1, "first"),
    new ViewModel(2, "second"),
    new ViewModel(3, "third"),
    new ViewModel(4, "fourth")
};

MyListView = CollectionViewSource.GetDefaultView(MySourceCollection);
MyListView.Filter = o => ((ViewModel)o).Number >= 3;

XAML:

<DataGrid ItemsSource="{Binding MySourceCollection}" />

结果:

Research #QAnon

我不知道是否建议这样做,但是我还没有发现任何问题。请记住,如果您重新初始化源列表,则必须再次调用CollectionViewSource.GetDefaultView并重新应用过滤器。