2

Windows Phone 8 アプリで、LongListSelector から MenuItem を削除しようとしています。MenuItems はクリックするとさまざまな音を鳴らし、ユーザーがそれらを削除できるようにしたいと考えています。

アプリには 2 つのパネルがあります。2 番目のパネルは新しいサウンドを録音し、その録音を新しい 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}>

選択したサウンドを作成:

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

同じ問題がありましたが、単純なリストを使用しました。

解決策は簡単でした-リストの新しいオブジェクトを作成するだけです

var newList = new List<TheModel>();

newList.AddRange(originalList);

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

originalList は項目が削除されたリストでした。

これは最も効率的な方法ではありませんが、機能します。小さいデータなら問題ないと思います。

于 2014-08-11T17:32:25.860 に答える