MVVM デザイン パターンと非同期データ アクセス メソッドを使用する大規模な WPF アプリケーションがあります。コールバック ハンドラーとIAsyncResult
インターフェイスを備えた古いスタイルの非同期コードを使用します。典型的な例を次に示します。
function.BeginInvoke(callBackMethod, asyncState);
次に、ビュー モデルには、次のコールバック ハンドラがあります。
private void GotData(GetDataOperationResult<Genres> result)
{
UiThreadManager.RunOnUiThread((Action)delegate
{
if (result.IsSuccess) DoSomething(result.ReturnValue);
else FeedbackManager.Add(result);
});
}
RunOnUiThread
方法は基本的に次のとおりです。
public object RunOnUiThread(Delegate method)
{
return Dispatcher.Invoke(DispatcherPriority.Normal, method);
}
この問題は、ユーザーがオブジェクトを編集できるようにする 1 つのビュー モデルにのみ影響しRelease
ます。関連するビューでは、最初に読み込まれるときに、データベースからデータを取り込む特定のコレクションComboBox
が要求されます。と呼ばれるコレクションが 1 つだけあると言って、これを単純化しましょうGenres
。データがビュー モデルに到着すると、次のように処理されます。
private void GotGenres(GetDataOperationResult<Genres> result)
{
UiThreadManager.RunOnUiThread((Action)delegate
{
if (result.IsSuccess) Genres.AddEmptyItemBefore(result.ReturnValue);
else FeedbackManager.Add(result);
});
}
コレクションが存在Release
し、UI でオブジェクトが選択されている場合、次のコードRelease.Genre
でコレクションから現在の値を選択します。
if (!Release.Genre.IsEmpty && Genres.ContainsItemWithId(Release.Genre.Id))
Release.Genre = Genres.GetItemWithId(Release.Genre);
この時点で、これはすべて正常に機能し、これがビュー モデルからプロパティを参照する唯一の行であることに注意してください。Release.Genre
私の特定の問題は、Release.Genre
プロパティが設定されていることがあり、null
どのように、またはどこから解決できないことです。>> 編集 >> プロパティ セッターにブレーク ポイントを配置すると、<< 編集 << は、行しかないためCall Stack
、値を設定しているものに関する実際の手がかりを提供しません。ウィンドウからオプションを選択すると、基本的な非同期コード呼び出しが表示されます。null
[Native to Managed Transition]
Show External Code
Call Stack
この問題を解決しようとしているときに発見した次の事実を確認できます。
Release.Genre
プロパティを参照する1行は、それをに設定していませんnull
。- Genres.AddEmptyItemBefore(result.ReturnValue) への呼び出しはそれを設定していません
null
...これはGenres
、 'empty' を追加した後に結果コレクションをコレクションに追加するだけGenre
です。 Release.Genre
プロパティは、Genres.AddEmptyItemBefore(result.ReturnValue) の呼び出し中または呼び出し後に設定されることがありますが、null
それが原因ではありません... いくつかの場合にステップスルーすると、実行が (無関係な方法で) ブレークにジャンプしました入力パラメーターがであるRelease.Genre
プロパティ セッターに設定したポイントですが、これは毎回発生しません。value
null
- 通常、関連するビュー モデルからビュー モデルに移動するときに発生し
Release
ますが、毎回ではありません。 - 関連するビュー モデルには、
Release.Genre
プロパティへの参照がありません。
明確にするために、私が提供したまばらな情報から私の問題をデバッグするように誰かに頼んでいるわけではありません。また、非同期データ呼び出しについてアドバイスを求めているわけでもありません。代わりに、私はまだ考えていない新しい進行方法を見つけようとしています。一部のコード (ほぼ確実に私のコード) のどこかでプロパティが設定されていることを理解していますnull
...私の質問は、このコードがどこにあるかをどのように検出できますか? Release
ビューモデルにはないようです。手がかりがないまま、この問題をデバッグし続けるにはどうすればよいですか?