Как обновить / обновить LongListSelector после удаления элемента MenuItem (в Windows Phone 8)?

Я пытаюсь удалить MenuItem из LongListSelector в моем приложении для Windows Phone 8. Элементы меню воспроизводят различные звуки при нажатии, и я хочу, чтобы пользователь мог их удалить.

В приложении есть две панели. Вторая панель записывает новый звук и помещает запись в LongListSelector в качестве нового MenuItem.

Проблема: после удаления дисплей выглядит точно так же, а звук продолжает воспроизводиться! Однако, если я записываю новый звук (переключаясь на новую панель записи), то удаление работает с удаленным удаленным MenuItem.

Как заставить обновление / обновление LongListSelector выгрузить / удалить MenuItem и связанные звуковые данные, хранящиеся в GUI?

Следующий код вызывается из события click MenuItem. LongListSelector называется "CustomSounds":

private void DeleteSoundClick(object sender, RoutedEventArgs e)
{
    var menuItem = sender as MenuItem;
    if (menuItem == null) return;

    var soundData = menuItem.DataContext as SoundData;
    if (soundData == null) return; 

    if (soundData.FilePath.Contains(CustomSounds.Name))
    {
        CustomSounds.ItemsSource.Remove(soundData);
    }

    this.LayoutRoot.UpdateLayout();
}

3 ответа

Переверни свою вещь. Установить источник элемента с новым списком.

private void DeleteSoundClick(object sender, RoutedEventArgs e)
{
    var menuItem = sender as MenuItem;
    if (menuItem == null) return;

    var soundData = menuItem.DataContext as SoundData;
    if (soundData == null) return; 

    if (soundData.FilePath.Contains(CustomSounds.Name))
    {
        MyNewList.remove(soundData);
        CustomSounds.ItemsSource = myNewList;
    }

    this.LayoutRoot.UpdateLayout();
}

Создайте локальную переменную и установите ваш ресурс в конструкторе.

Другая вещь:

создать обновленный список:

private ObservableCollection<Sound> _myNewList;
public ObservableCollection<Sound> MynewList{
get
  {
    return _myNewList;
  }
  set
  {
    _myNewList= value;
    RaisePropertyChanged(MynewList); 
   }

Свяжите это в вашем списке:

<listbox itemSource="{Binding MyNewList" SelectedItem="{Binding SelectedSound,mode=twoway}>

Создать selectedSound:

private Sound _selectedSound;
public Sound SelectedSound{
get
  {
    return _selectedSound;
  }
  set
  {
    _selectedSound= value;
    RaisePropertyChanged(SelectedSound); 
   }

Удалить пункт:

private void DeleteSoundClick(object sender, RoutedEventArgs e)
{
    if(SelectedSound != null){
Mynewlist.remove(SelectedSound);
}

}

: D

ObservableCollection - это не что иное, как коллекция с уведомлением о том, что когда что-то изменяется в коллекции, она сообщает об этом пользовательскому интерфейсу. Это просто ItemSource, поэтому ваш LongListSelector заполняется OC...

У меня была та же проблема, однако я использовал простой список.

Решение было простым - просто создали новый объект списка

var newList = new List<TheModel>();

newList.AddRange(originalList);

TheLongListSelector.ItemsSource = newList;
TheLongListSelector.UpdateLayout();

originalList был список с удаленным элементом.

Это не самый эффективный способ, но он работает. Я думаю, что это не проблема для небольших данных.

Другие вопросы по тегам