2016-08-19 10 views
0

の初期化子で「ShowDialogメソッド」を中止します:は、私はこのような別のダイアログを呼び出すボタンでメインウィンドウを持って、そのダイアログ

public TableView() 
{ 
    InitializeComponent(); 
    this.tableViewModel = this.DataContext as TableViewModel; 
    this.tableViewModel.CloseAction += this.Close; 
} 

これは、もちろん、私は時々例外に遭遇していますビューモデルのコンストラクタを呼び出します。私はビューモデルのコンストラクタ(try{}catch{})でこの例外を処理しましたが、現在TabeViewはまだ表示されています。これを解決するために、私はxaml.csコンストラクタに入れていた。

public TableView() 
{ 
    InitializeComponent(); 
    this.tableViewModel = this.DataContext as TableViewModel; 
    this.tableViewModel.CloseAction += this.Close; 

    if (this.tableViewModel.ListOfViewModels == null) 
     this.Close(); 
} 

が、その後dialog.ShowDialog();は(すでに閉鎖されているダイアログを表示しようとしている)エラーを返します。これを行うための良い練習方法がありますか? dialog.ShowDialog();に例外を発生させないthis.Close();に電話する方法はありますか?

+0

回避するのではなく、例外を修正することはできませんか? – SledgeHammer

+0

@SledgeHammer例外は、ユーザーがExcelなどで開いた可能性のある.csvファイルを読み込もうとしたことによるものではありません。その場合、メッセージボックスを表示してから、このTableViewの読み込みを中止しようとしています。 – derekantrican

+1

新しい/ ShowDialog呼び出しをメインフォームに置き換えてみましたか?そうすれば、ダイアログは正しく構築されず、表示されず、メインフォームからエラーボックスを表示することができます。もう一つの選択肢はあなたのコードを再構成してダイアログが "初期化されていない"状態で表示され、その上にエラーボックスが表示されますが、ユーザは2つのダイアログを閉じる必要があります。 – SledgeHammer

答えて

0

質問はおそらく広すぎます。あなたは多くの可能な解決策への扉を開く多くの詳細を省いた。つまり、私はこれにアプローチするいくつかの基本的な方法があると思う:

  1. ビューモデルのコンストラクタで例外をキャッチしないでください。 TableViewオブジェクトを作成するコードに伝播させ、例外が発生した場合はShowDialog()を呼び出さないようにしてください。
  2. ビューモデルで例外をキャッチし、ビューが表示されるのに適した「初期化に失敗しました」状態を指定します。その後、ShowDialog()に電話して、ダイアログがユーザに表示されるようにします。必要に応じて、ダイアログが開いた後にダイアログを閉じることができます(例: 5秒間(ダイアログが閉じられるよりも適切な警告がユーザーに表示されます)。もちろん、このオプションの動作を追加するには、ビューとビューモデルの調整が必要です。ビューがビュー・モデルの状態をチェックしてから、タイマーを開始してからダイアログを閉じます。
  3. より先に例外をスローする初期化を実行して、ダイアログオブジェクトを作成するを作成します。それが成功した場合は、ダイアログコンストラクタに渡します。ダイアログコンストラクタはビューモデルコンストラクタに渡します。あるいは、初期化したデータを、プロパティを使用して構築した後に設定することもできます。

上記は包括的なリストには含まれていませんが、今やコードの状態が最も望ましい解決策である可能性があります。より具体的なものをご希望の場合は、あなたのシナリオがどのようなものかを明確に示す良いMinimal, Complete, and Verifiable code exampleを提供してください。

関連する問題