MVVM パターンに従って WPF アプリケーションを作成しています。
単一のユーザー コントロールを保持するためのプレースホルダー (コンテンツ コントロール) と同様に、ナビゲーション コントロールを含む 1 つのウィンドウがあります。メイン ウィンドウのビューモデルは、開いている子ビューモデルの配列を維持し、配列から単一の子ビューモデルを指す「CurrentView」プロパティを持ちます。この「CurrentView」プロパティは、メイン ウィンドウの contentcontrol プレースホルダーにバインドされます。ビューモデルはすべて、データ テンプレートを介して特定のビュー (ユーザー コントロール) で設定されます。
'CurrentView' プロパティが子ビューモデルの 1 つに設定されている場合、適切なユーザー コントロール ビューがメイン ウィンドウの contentcontrol プレースホルダーに表示されます。一度に表示される子ビューモデルは 1 つだけです。残りは配列に格納され、CurrentView プロパティに設定されて表示されるのを待ちます。
今まで、このパターンで問題はありませんでした。すべての標準 WPF コントロールで問題なく完全に機能します。私の問題は、ユーザー コントロールの 1 つが WPF Crystal Report Viewer をホストしている場合のみです。
現在のビューを、Crystal Report reportdocument を持つビューモデルに設定できます。レポート ドキュメントを読み込み、パブリック依存関係プロパティとして公開します。このビューモデルのデータ テンプレート ユーザー コントロールには、WPF Crystal Report Viewer コントロールがあります。添付プロパティをレポート ビューアー コントロールに追加して、.ViewerCore.ReportSource にバインドできるようにしました。ビューモデルのレポート ドキュメントを添付プロパティにバインドすると、出来上がりです。これはすべて期待どおりに機能します。プログラムをコンパイルし、Crystal Report Viewer に移動します...バインドされたレポートが読み込まれ、適切に表示されます。
ただし、別の場所に移動すると (メイン ウィンドウの 'CurrentView' プロパティを別のビューモデルに置き換えます)、エラーが発生します。
最初は、「プロパティが設定されていません: ウィンドウ」と表示されていました。いくつか検索した結果、Crystal Report Viewer がメッセージボックスを表示しようとしていることがわかりましたが、それが所有者ウィンドウであることを認識していなかったため、表示できませんでした。これを修正するために、Crystal レポート ビューアの所有者を、ユーザー コントロールのロード イベントのメイン ウィンドウに設定しました。これにより、「プロパティが設定されていません: ウィンドウ」エラーが解消されました。
再コンパイルしてレポートに移動すると、正常に読み込まれます。別の場所に移動すると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というポップアップが表示されます。OK をクリックすると、ポップアップは消え、目に見える問題は発生せずにプログラムが続行されます。レポートに戻ることができます。問題はありませんが、移動するたびにこのポップアップが表示されます。
ポップアップのソースをデバッグすることはできません。所有者を削除すると、ビューアーがエラーを表示する所有者を見つけられないことに飲み込まれてしまうからです。
冗長な説明で申し訳ありません。プロジェクトは非常に大きいため、ソース コードを収めようとすると、説明よりもはるかに多くのスペースが必要になります。私のコードの特定の部分を見たい場合は、コメントを残してください。質問を更新します。