0

Я в настоящее время реализую LLS (LongListSelector) в приложении WP8, которое сгруппировано. У меня есть контекстное меню из WPToolkit. Я надеялся найти, как удалить элементы из моего LLS, не переназначая предметы LLS. Рациональное я хочу сохранить позицию в списке после удаления элемента.Удаление элемента из сгруппированной LLS без повторного назначения источника данных?

Теперь у меня есть основной список, который хранит все мои объекты и передается функции «GetGroup» для возврата коллекции Observable групп в качестве источника элемента. Теперь я понимаю, что просто удаление из основного списка не удаляется из источника элемента. Поэтому вместо этого я удалился из основного списка, а также передал элемент ItemSource в коллекцию Observable и удалил его. Он работал, вплоть до конкретных экземпляров (удаление второго в последний элемент в списке). Затем я получаю критическое исключение (значение за пределами границ). Однако путем отладки все правильные значения вызываются и удаляются, и после этого следует исключение. Как я могу сделать это правильно? Что я делаю неправильно? Ниже приведены мои фрагменты кода.

Группировка:

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>, но тогда я верю, что потеряю простое добавление/сортировку, правильно?

Кроме того, я предположил, что проблема может быть связана с тем, что я пытаюсь удалить элемент из двух отдельных списков. Однако я пробовал его только с одним, и у меня все еще есть одна и та же проблема с исключениями, которую я предполагаю, из-за актера (т. Е. Возможность удалить все до второго, а затем последнего элемента).

Большое спасибо за любую входящую помощь.

ответ

0

Если у вас есть ViewModel реализован правильно, то удаление объекта T из ObservableCollection действительно удалит его из ItemsSource LLS! Когда коллекция будет изменена, ObservableCollection активирует событие CollectionChanged, которое оно имеет из-за наследования с интерфейса INotifyCollectionChanged.

Я бы определенно прочитал стратегии MVVM, потому что это похоже на то, что в вашей реализации что-то не так.

Что касается текущего решения,

У вас есть несколько опечаток плавающие вокруг. Я бы загрузил ReSharper, который точно определяет это для вас. Такие вещи, как:

  • <ITemClass> // столица T
  • private ObservableCollection<Model.Cartitem> cartList = new ObservableCollection<Model.allItems>(); // Model.Carditem против Model.allItems?

Если вы считаете, что это проблема кастинга, очень разумно проверять ваши нулевые утверждения каждый раз, когда вы пытаетесь получить доступ к свойству класса. Также полезно использовать синтаксис 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 быть удаление editingItem или editingCardItem? Помните об этом.

В противном случае, я бы очистил ваш код, но я не вижу никаких других вопиющих проблем, не углубляясь, так как ваш код немного позади, и синтаксис трудно разобрать. Удачи!

+0

Благодарим вас за заметки, я сделал небольшое редактирование в своей копии и вставке, чтобы получить его здесь (сократил все имена), но все равно получит Reshaper. И попробуй многое из того, что ты предложил. Я не использовал строковый шаблон MVVM в этом, поскольку я начал еще задолго до того, как узнал об этом, а затем ему сказали, что для простого приложения (скажем, двух страниц) мне это действительно не понадобилось, поэтому я не сделал этого попробуйте изменить его. Нужно ли мне? – Poken1151

Смежные вопросы