2

我正在尝试从我的 Windows Phone 8 应用程序中的 LongListSelector 中删除 MenuItem。MenuItems 在单击时会播放各种声音,我希望用户能够删除它们。

该应用程序上有两个面板。第二个面板录制新声音并将录音作为新的 MenuItem 放在 LongListSelector 上。

问题:删除后,显示看起来完全一样,声音仍然播放!但是,如果我录制新的声音(切换到新的录制面板),那么删除工作会在删除的 MenuItem 消失的情况下进行。

如何强制 LongListSelector 的更新/刷新以卸载/删除位于 GUI 上的 MenuItem 和关联的声音数据?

从 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();
}
4

3 回答 3

1

ObservableCollection 只不过是一个带有通知的集合,当集合中的某些内容发生更改时,它会让 UI 知道。它只是一个 ItemSource,因此您的 LongListSelector 由 OC 填充...

于 2013-09-08T02:14:33.120 回答
1

反转你的东西。使用新列表设置项目来源。

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();
}

创建局部变量并在构造函数中设置您的 itemsource。

其他事情:

创建一个更新的列表:

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

于 2013-09-06T14:05:41.617 回答
0

我有同样的问题,但是,我使用了简单的列表。

解决方案很简单 - 刚刚创建了 List 的新对象

var newList = new List<TheModel>();

newList.AddRange(originalList);

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

originalList 是已删除项目的列表。

这不是最有效的方法,但它确实有效。我认为这对于小数据来说是没有问题的。

于 2014-08-11T17:32:25.860 回答