0

私は ObservableCollection プレイリストを持っています。このプレイリスト アイテムはリストボックスに表示されます。すべてのアイテムは、特別なスレッドでデータを更新します。すべてのデータを更新した後にのみ、リストボックス内の要素がその情報を更新する必要があります。実際、アイテム内のすべてのデータが変更されたことを通知する方法はありますか? 解決策は1つありますが、見た目が悪く、さらに場合によってはエラーにつながります。

private void AsyncMIReady(MediaItem mediaItem)
{
   if (PlayList.Contains(mediaItem))
   {
       CurSynchronizationContext.Post(delegate(object someState)
             {
                 UpdateItemInPlayList(mediaItem);
             }
                 , null);
    }
 }

public void UpdateItemInPlayList(MediaItem mediaItem)
{
    int i = PlayList.IndexOf(mediaItem);
    PlayList.RemoveAt(i);
    PlayList.Insert(i, mediaItem);
}
4

1 に答える 1

0

これは便利だと思いました。これには、ObservableCollection のサブクラス化と、AddRange での通知の一時停止が含まれます。

public class RangeObservableCollection<T> : ObservableCollection<T>
{
  private bool _suppressNotification = false;

  protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
  {
    if (!_suppressNotification)
      base.OnCollectionChanged(e);
  }

  public void AddRange(IEnumerable<T> list)
  {
    if (list == null)
      throw new ArgumentNullException("list");

    _suppressNotification = true;

    foreach (T item in list)
    {
      Add(item);
    }
    _suppressNotification = false;
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
  }
}
于 2013-02-12T14:25:47.020 に答える