現在、グループ化された 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番目、次に最後のアイテムまですべてを削除できます)。
入ってくる助けに感謝します。