c# – WPF将已过滤的ObservableCollection ICollectionView绑定
我想根据类型(类型AddPoint)过滤ObservableCollection到一个子集,并希望它按升序排序,没有重复.我的基类是ModelBase,w /子类AddPoint,Time,Repeat等…… ObservableCollection MotionSequenceCollection将以任何顺序填充这些类型,有些将是重复的.
我已经尝试了几次不同的时间,并在ICollectionView属性中显示它,我从’Bind subset of collection中拉出’. 可观察的收藏品 private ObservableCollection<ModelBase> _motionSequenceCollection = new ObservableCollection<ModelBase>(); public ObservableCollection<ModelBase> MotionSequenceCollection { get { return _motionSequenceCollection; } set { if (_motionSequenceCollection == value) { return; } var oldValue = _motionSequenceCollection; _motionSequenceCollection = value; // Update bindings,no broadcast RaisePropertyChanged(); } } public ICollectionView Location { get { var location = CollectionViewSource.GetDefaultView(_motionSequenceCollection); //DOES NOT WORK. PROBLEM: GetType() creates type of system.type() and AddPoint,which don't work. Need a cast,or something?? // found at https://stackoverflow.com/questions/9621393/bind-subset-of-collection The problem is that there is an error: // Cannot apply operator '==' to operands of type 'System.Type' and 'MotionSeq.Model.AddPoint',// candidates are: // bool ==(System.Reflection.MemberInfo,System.Reflection.memberInfo) (in class MemberInfo) // bool ==(System.type,System.Type) (in class Type) //location.Filter = p => (p as ModelBase).GetType() == AddPoint; //DOES NOT WORK. PROBLEM: Affects the main collection and won't let TIME type added. //location.Filter = o1 => (o1 is AddPoint); //DOES NOT WORK. PROBLEM: Sorts fine,but also sorts MotionSequenceCollection!! What up w/ that!? //location.SortDescriptions.Add(new SortDescription("AddPointClassName",ListSortDirection.Ascending)); //DOES NOT WORK. PROBLEM: MotionSequenceCollection does not update. //location.Filter = p => (p as ModelBase) == AddPoint; //DOES NOT WORK. PROBLEM: Source is not instantiated(?) and exmaple from stackoverflow and not sure how that got there in the first place. //source.Filter = p => (p as ModelBase).GetType() == "AddPoint"; //return source; return location; } } 解决方法
尝试创建CollectionViewSource并设置其过滤逻辑,如下所示: //create it as static resource and bind your ItemsControl to it <CollectionViewSource x:Key="csv" Source="{StaticResource MotionSequenceCollection}" Filter="CollectionViewSource_Filter"> <CollectionViewSource.GroupDescriptions> <PropertyGroupDescription PropertyName="YYY"/> </CollectionViewSource.GroupDescriptions> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="YYY" Direction="Ascending"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> private void CollectionViewSource_Filter(object sender,FilterEventArgs e) { var t = e.Item as ModelBase; if (t != null) { //use your filtering logic here } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |