1

モデル レイヤーでの状態変更をビューに伝達する必要がある MVVM アプリケーションがあり、そのビューでは、モデル レイヤーでさらに処理する前に状態変更を同期的に処理する必要があります。

特定のシナリオには、モデルとビューによって共有される COM オブジェクトが含まれており (ひどいレガシー アーキテクチャに基づいて構築された結果として)、モデルは共有 COM オブジェクトに対して Marshal.ReleaseComObject を実行する必要がありますが、ビューはその参照を解放する必要があります。事前に COM オブジェクトに追加します (そうしないと、RCW が無効になり、この特定のビュー コンポーネントの背後にあるネイティブ実装が激しく爆発します)。

これを実装するために使用したメカニズムは、ビューの依存関係プロパティをモデルのプロパティにデータバインドすることでした。viewmodel レイヤーはこの変更通知を中継します。モデル レイヤーとビューモデル レイヤーの両方が、バインディングをサポートするために必要な INotifyPropertyChanged インターフェイスを実装します。ビューでは、依存関係プロパティは、PropertyChanged ハンドラーをアタッチする PropertyMetadata インスタンスに登録されます。

私が見つけた問題は、私の PropertyChanged ハンドラーが同期的に呼び出されていないことです。モデルで PropertyChanged イベントを発生させると、ビューがバインドされるプロパティに正しく中継されますが、その時点で依存関係プロパティの PropertyChanged イベントは発生しません。数行のコードの後、モデルは Marshal.ReleaseComObject を呼び出し、その呼び出し内で依存関係プロパティ PropertyChanged イベントが同じ (メイン UI) スレッドで呼び出されます。

バインディングが依存関係プロパティ PropertyChange 呼び出しをメッセージ ループにポストし、ReleaseComObject への呼び出しがメッセージ ループにそのメッセージを処理させているように私には見えます。

朝の調査の後、なぜこれが発生するのかを説明するものは何も見つかりませんでした。バインディングで IsAsync=false を設定しても効果はありません。

私はすでにこの問題の許容可能な回避策を持っていますが、ここで何が起こっているのかを本当に理解したいと思っています. ここで何が起こっているのか知っている人、または同様の行動の経験がある人はいますか?

4

0 に答える 0