過去記事でデータバインドした GridView にデータ操作するとエラーになる対策を書いたけど、またハマったので追記w
過去記事では
void _listener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender, Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args) { // データ受信的な処理 await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegate { hoge.AddHoge(受信データ); }); }
な感じで、Dispatcher.RunAsync で囲っとけばオッケー!的に書いたけど、割とダメなケースが出てきた。
ダメなケース
そもそも Dispatcher.RunAsync って Windows.UI.Core なので、ページがある前提だったりする。
つまり、クラス内でイベント発生したりして、バインドしたデータ操作からのエラー!! というケースがある。
モデル、モデルビューをきっちりクラス化して、ビュー(ページ)にはバインドするだけ!頑張れモデル!!な作りにしたらこうなったw
Class内完結なデータ操作でDispatcher.RunAsync 差し込みたいときどーすりゃいいんだろう… Class→Classでデータ通信してデータ操作が加わるんだけど、View側はそのClassをBindingしてるだけだし。 #win8dev_jp
— 半熟煮玉子 (@fxxk_authority) 2015, 1月 16
イベントもクラス内で発生させてるから、そのイベントによってUI操作が発生するのが気に入らんのか。むぅ
— 半熟煮玉子 (@fxxk_authority) 2015, 1月 16
対応
もうちょっと根底な部分から呼ぶようにした。
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( CoreDispatcherPriority.Normal, new DispatchedHandler(() => { // ここにUI処理 }));
ここでいうUI処理は、「NotifyPropertyChanged」な通知も含む。というか通知の瞬間がやばいので、そっちを対応した方がいいのか??
ともかく、これで解決!!