0

現在、グループ化された WP8 アプリで LLS (LongListSelector) を実装しています。WPToolkit のコンテキスト メニューがあります。LLS のアイテムソースを再割り当てせずに、LLS からアイテムを削除する方法を見つけたいと思っていました。アイテムを削除した後、リスト内の位置を維持したい合理的な存在。

私が今持っているのは、すべてのオブジェクトを保持するメイン リストであり、「GetGroup」関数に渡されて、グループの Observable コレクションをアイテム ソースとして返します。メイン リストから削除するだけではアイテム ソースから削除されないことを理解しました。代わりに、メイン リストから削除し、ItemSource を Observable コレクションにキャストして、そこから削除しました。特定のインスタンスまで機能しました(リストの最後から2番目のアイテムを削除します)。次に、不可解な例外 (値が範囲外) が発生します。ただし、デバッグを介して、すべての適切な値が呼び出されて削除され、その後に例外が続きます。これを正しい方法で行うにはどうすればよいですか?私は間違って何をしていますか? 私のコードスニペットは以下のとおりです。

グループ化:

    private ObservableCollection<Model.Cartitem> cartList = new ObservableCollection<Model.allItems>(); // Overall Item list for current instance.  

    class Group<T> : ObservableCollection<T>, INotifyPropertyChanged
    {
        public Group(string name, IEnumerable<T> items)
            : base(items)
        { 
            this.imagePath = new Uri(name, UriKind.Relative);
        }
        private String _Title;
        private Uri _imagePath;

        public string Title
        {
            get
            {
                return _Title;
            }

            set
            {
                if (_Title != value)
                {
                    _Title = value;
                    NotifyPropertyChanged("Title");
                }
            }
        }


        public Uri imagePath
        {
            get
            {
                return _imagePath;
            }

            set
            {
                if (_imagePath != value)
                {
                    _imagePath = value;
                    NotifyPropertyChanged("imagePath");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,
                    new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    // Functions to Handle Group Lists
    private ObservableCollection<ITemClass> GetItemList()
    {
        return allItems;
    }

    private ObservableCollection<Group<ItemClass>> GetItemGroups()
    {
        IEnumerable<ItemClass> tempItemList = GetCartList();
        return GetItemGroups(tempItemList , c => c.ItemCategory.ID + "|" + c.ItemCategory.Name + "|" + c.ItemCategory.IMPath);
    }

    private static ObservableCollection<Group<T>> GetItemGroups<T>(IEnumerable<T> itemList, Func<T, string> getKeyFunc)
    {
        IEnumerable<Group<T>> groupList = from item in itemList
                                          group item by getKeyFunc(item) into g
                                          orderby g.Key
                                          select new Group<T>(g.Key, g);

        //return groupList.ToList();
        ObservableCollection<Group<T>> t = new ObservableCollection<Group<T>>();
        foreach (Group<T> sublist in groupList)
        {
            t.Add(sublist);
        }

        return t;
    }

削除の処理方法:

        this.cartList.Remove(editingCartItem);

        ObservableCollection<Group<ItemClass>> t = (ObservableCollection<Group<ItemClass>>)LongListSelectorObj.ItemsSource;

        foreach (Group<ItemClass> sublist in t)
        {
            if(sublist.Contains(editingItem))
                sublist.Remove(editingItem);
            break;
        }

当時の問題を解決できると考えて、すべてを ObservableCollection にしようとする最近の変更を加えたため、少し肥大化しています。それは他のことにも役立ちましたが、単純にリストが違うだけだと思います。

これを変更して ObservableCollection> を直接バインドできると思いますが、そうすると簡単な追加/並べ替えができなくなると思いますよね?

また、2 つの別々のリストからアイテムを削除しようとしていることが原因である可能性があると考えました。ただし、1つだけで試してみましたが、キャストからのものと思われる同じ例外の問題がまだあります(つまり、最後から2番目、次に最後のアイテムまですべてを削除できます)。

入ってくる助けに感謝します。

4

1 に答える 1

0

ViewModel が正しく実装されている場合、ObservableCollection から T オブジェクトを削除すると、LLS の ItemsSource から実際に削除されます。コレクションが変更されると、ObservableCollection は CollectionChanged イベントを発生させます。これは INotifyCollectionChanged インターフェイスから継承されているためです。

あなたの実装に何か問題があるように見えるので、私は間違いなくMVVM戦略を読んでいます。

現在の解決策については、

いくつかのスペルミスが浮かんでいます。これらを非常に迅速に特定する ReSharper をダウンロードします。次のようなもの:

  • <ITemClass>// 大文字の T
  • private ObservableCollection<Model.Cartitem> cartList = new ObservableCollection<Model.allItems>();// Model.Carditem 対 Model.allItems?

キャストの問題だと思われる場合は、クラス プロパティにアクセスしようとするたびに null ステートメントを確認することをお勧めします。null チェックに役立つas構文(link)を使用することもお勧めします。

DataType data = value as DataType; 
if (data != null) {
    string title = data.Title;
}

この行については、

this.cartList.Remove(editingCartItem);

これを次のように変えてみてください:

if (editingCardItem != null && this.cardList.Contains(editingCartItem)){
    this.cardList.Remove(editingCardItem);
}

また、sublist削除する必要がありますeditingItemeditingCardItem?これらのことを心に留めておいてください。

それ以外の場合は、コードをクリーンアップしますが、コードが少し過剰であり、構文を解析するのが難しいため、深く掘り下げることなく、他の明白な問題を確認することはできません。幸運を!

于 2013-09-21T04:36:52.753 に答える