5

タイプ (タイプ AddPoint) に基づいて ObservableCollection をサブセットにフィルターし、重複なしで昇順に並べ替えたいと考えています。私の基本クラスは ModelBase で、サブクラス AddPoint、Time、Repeat などがあります。ObservableCollection MotionSequenceCollection はこれらの型で任意の順序で埋められ、一部は重複します。

私は何度か試してみましたが、以下から「プル」した ICollectionView プロパティでそれらを示しました: 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;
        }
    }
4

2 に答える 2

1

タイプによるフィルタリングは簡単です。これはうまくいくはずです:

location.Filter = p => p.GetType() == typeof(AddPoint);

並べ替えも非常に簡単です。実装してコレクション ビューのプロパティにIComparer割り当てるだけです。CustomSort

重複を削除する簡単な方法はありません(私が知っているわけではありません)。他の場所で行うことをお勧めします。たとえば、基になるコレクションを区別できます。

于 2013-06-30T08:02:28.990 に答える