WPF用ObservableCollection

以前WPFにバインディングされたObservableCollectionを他スレッドから操作すると例外になるLink 件で悩んだ以後、CollectionのAdd/Removeはせずに毎回Collectionを作り直すという消極策に出ていたのですが、今回どうやら避けて通れない事態に。View側でCollectionChangedイベント監視するの面倒だなぁと思ってたら、答えLink は意外にも簡単なところに。去年もうちょっとちゃんと調べればよかった。

なんとなくViewModel/ModelがViewの事情に譲歩しているような気もしますが、これくらいなら個人的には許容範囲。(UIスレッドのDispatcher得るためにViewとViewModelに細工しないといけないならやるか悩んだかも)

[2018/4/23 追記] .NET Framework 4.5以上ではBindingOperations.EnableCollectionSynchronizationLink を使ったほうが楽でしょう。私も場合、いまだにXPで動いている案件が有ったりするので…

using System.Collections.ObjectModel;
using System.Windows.Threading;

class DispatchedCollection<T> : ObservableCollection<T>
{
    Dispatcher uiDispatcher = System.Windows.Application.Current.Dispatcher;

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (uiDispatcher.CheckAccess())
        {
            base.OnCollectionChanged(e);
        }
        else
        {
            uiDispatcher.Invoke(new Action(() => base.OnCollectionChanged(e)));
        }
    }
}

[参考] マルチスレッド環境下でのコレクションの操作 (かずきのBlog@Hatena)Link

— posted by mu at 06:53 pm  

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0088 sec.
prev
2013.4
next
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30