Как обновить / обновить 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 был список с удаленным элементом.
Это не самый эффективный способ, но он работает. Я думаю, что это не проблема для небольших данных.