1

私はこのトピックについてあまり経験がないので、これがあまり明確でない場合はご容赦ください。

セクションの ObservableCollection を持つポータブル クラス ライブラリを作成しました。各セクションにはアイテムの ObservableCollection があります。

これらのコレクションはどちらも、個別の Win8 アプリと WP8 アプリの UI にバインドされています。

UIがPCLクラスから更新されるように、これらのコレクションを正しく設定する正しい方法を見つけようとしています。

クラスがwin8プロジェクト内にある場合、Dispatcher.BeginInvokeのようなことができることはわかっていますが、これはPCLに変換されず、WP8プロジェクトで再利用することもできません.

このスレッド ( Dispatcher.Invoke または Dispatcher.RunAsync に相当するポータブル クラス ライブラリ) で、 SynchroniationContext クラスを発見しました。

メイン アプリの SynchroniationContext への参照を渡しました。更新されるオブジェクトが 1 つだけであるため、セクションにデータを入力するときにそれを行うことができます。

if (SynchronizationContext.Current == _synchronizationContext)
{
    // Execute the CollectionChanged event on the current thread
    UpdateSections(sections);
}
else
{
    // Post the CollectionChanged event on the creator thread
    _synchronizationContext.Post(UpdateSections, sections);
}

ただし、記事で同じことをしようとすると、セクションと記事の両方への参照が必要ですが、Post メソッドでは 1 つのオブジェクトしか渡すことができません。

ラムダ式を使用しようとしました:

if (SynchronizationContext.Current == _synchronizationContext)
    {
// Execute the CollectionChanged event on the current thread
    section.Items.Add(item);
}
else
{
    // Post the CollectionChanged event on the creator thread
    _synchronizationContext.Post((e) =>
    {
        section.Items.Add(item);
    }, null);
}

しかし、「別のスレッドにマーシャリングされている」というエラーが発生しているため、これは正しくないと思います。

では、ここでどこが間違っているのでしょうか? 両方のアプリが UI も更新できるように、PCL から両方のコレクションを正しく更新するにはどうすればよいですか?

どうもありがとう!

4

3 に答える 3

1

少なくとも ViewModel では、公開されているすべての状態変更 (つまり、プロパティ変更通知と ObservableCollections への変更) が UI スレッドで発生することをお勧めします。モデルの状態の変更でも同じことを行うことをお勧めしますが、別のスレッドで変更を行い、それらの変更を ViewModel の UI スレッドにマーシャリングすることは理にかなっているかもしれません。

もちろん、これを行うには、移植可能なコードで UI スレッドに切り替えることができる必要があります。SynchronizationContext が機能しない場合は、ディスパッチャ (つまり IRunOnUIThread) 用に独自の抽象化を作成してください。

于 2013-04-30T19:07:02.273 に答える