2016-08-19 30 views
0

初始化一個「的ShowDialog」我有一個按鈕,一個主窗口調用另一個對話框,如下所示:中止在該對話框

TableView dialog = new TableView(); 
dialog.ShowDialog(); 

在該視圖的xaml.cs構造它看起來是這樣的:

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();返回一個錯誤(試圖表明已經關閉對話框)。對我來說,有沒有一種很好的練習方式?也許有一種方法可以調用this.Close();,它不會在dialog.ShowDialog();中拋出異常?

+0

是不是可以修復異常而不是試圖解決它? – SledgeHammer

+0

@SledgeHammer沒有例外來自嘗試讀取用戶可以在Excel中打開的.csv文件。所以如果是這樣的話,我試圖顯示一個消息框,然後中止加載這個TableView – derekantrican

+1

你試過把try catch放在主窗體中的新/ ShowDialog調用上嗎?這樣,對話框將無法正確構建,並且不會顯示,您可以從主窗體中顯示錯誤框。另一種選擇是重構代碼,使對話框以「未初始化」狀態顯示,並在其上面顯示錯誤框,但用戶將不得不關閉2個對話框。 – SledgeHammer

回答

0

這個問題可以說是太寬泛了。你已經遺漏了很多細節,這爲一些可能的解決方案打開了大門。也就是說,我認爲有一些基本的方法可以解決這個問題:

  1. 不要在視圖模型構造函數中捕獲異常。讓它傳播到創建TableView對象的代碼,並讓該代碼在發生異常時不會調用ShowDialog()
  2. 捕捉視圖模型中的異常併爲視圖提供合適的「未初始化」狀態。然後繼續並撥打ShowDialog()並讓對話框顯示給用戶。或者,允許對話框在打開後打開。五秒鐘(對用戶的合適警告將比對話框關閉)。當然,增加這種可選行爲將需要視圖和視圖模型之間更多的協調;您將希望視圖檢查視圖模型狀態,然後啓動一個定時器,之後對話框將被關閉。
  3. 執行異常拋出初始化之前的創建對話框對象。然後,如果成功,則將其傳遞給對話框構造函數,然後將其傳遞給視圖模型構造函數。或者,允許通過屬性在施工後設置初始化數據。

以上內容遠不是一個全面的列表,但代表了現在給定代碼狀態的可能最理想的解決方案。如果您想要更具體的內容,請提供一個很好的Minimal, Complete, and Verifiable code example,以清楚地顯示您的方案的外觀。