SimpleMVVM フレームワークを使用して WPF アプリケーションを構築していますが、例外をキャッチできません。SimpleMVVM の MessageBus を使用して、別のビューモデルにメッセージを送信します。これはすべて正常に動作しますが、メッセージバスによって実行されるコードで発生した例外が抑制されることに気付きました。ここに私がこれまでに持っているものがあります:
Myには、MainWindowViewModelMainWindow
で起動するボタンが含まれていますTempCommand
。このコマンドはTest
、SimpleMVVM の MessageBus を使用して通知メッセージを送信するメソッド (以下に示す) を呼び出します。
private void Temp()
{
SendMessage("Temp", new NotificationEventArgs());
}
MyMainWindow
にもFrame
with コンテンツが含まれています。このコンテンツの ViewModel はCustomerViewModel
、コンストラクターでこれらの通知を受け取るように登録されています。
public CustomerDetailsViewModel(ICustomerServiceAgent agent)
{
RegisterToReceiveMessages("Temp", Temp);
}
Temp
メソッドが単純に例外をスローする場合:
private void Temp(object sender, NotificationEventArgs args)
{
throw new NotImplementedException("Somewhere, something horrible happened");
}
Temp
アプリケーションをデバッグすると、メソッドが呼び出され、例外が発生していることがはっきりとわかります。でもなぜかそれだけ。アプリケーションは影響を受けず、例外トラップ コードは例外を認識しません。
2 つの方法で例外をトラップします。1 つ目は、次のイベントを処理することDispatcher
です。
<Application x:Class="MyApp"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
DispatcherUnhandledException="App_DispatcherUnhandledException">
コード ビハインドは次のようになります。
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
Log("Exception: " + e.Exception.Message);
e.Handled = true;
}
public static void Log(string message)
{
File.AppendAllText(@"D:\Temp\log.txt", "[" + DateTime.Now.ToString("F") + "] [" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "] " + message + Environment.NewLine);
}
このコードはいくつかの例外をキャッチしますが、すべてではありません。WPF はデフォルトでデータバインディングの例外を抑制することがわかりました。ViewModels はDataContext
ビューのプロパティを介してバインドされているため、これが問題だと思いました。クラスを使用するを定義するこの記事を見つけました。データバインディングの例外がキャッチされるようになりましたが、MessageBus を介して実行されるコードでスローされた例外ではありません。TraceListener
PresentationTraceSources
この動作を示すソリューションを作成しました。ここからダウンロードできます。
そして、これは私が立ち往生しているところです。私は何が欠けていますか?これらの例外をキャッチするにはどうすればよいですか?
よろしくお願いします。
JP