2015-10-01 78 views
-1

我有一個主窗口,其中包含多個UserControls,排列爲標籤頁和標籤組(很像Visual Studio允許同時顯示兩個或多個編輯器)。Winforms數據綁定和多個表格

我也有可能打開這樣一個UserControl到一個單獨的浮動窗口。

其中一個UserControls包含簡單的表單域(例如文本框)。這些文本框與通用數據綁定到一個對象/屬性。綁定模式是OnValidation(而不是OnPropertyChanged)。

當我將焦點從主窗口內的此用戶控件切換到主窗口中的另一個用戶控件時,將自動執行驗證並完成數據綁定/將在模型對象/屬性上設置更改的文本限於該文本字段。

但是,如果我將焦點切換到駐留在另一個(浮動)窗口中的UserControl,數據綁定未完成,因爲未執行驗證。

我知道我可以通過觸發ValidateChildren等來手動處理,但這看起來是我錯了/很醜。

有沒有一個「正確的」/乾淨的方式來解決這個問題?我希望在UserControl失去焦點或窗口被取消激活後立即執行驗證。

一個信息:對我的UserControls包含一個TreeControl。如果我編輯樹節點標籤,並且當我將焦點切換到另一個窗口時,標籤編輯會自動完成。我想通常的表單字段相關的綁定行爲...

感謝您的幫助!

回答

0

有沒有自動的方式來做到這一點。從控件的角度來看,它仍然是焦點(如果您單擊標題欄或Alt-Tab回到主窗口,您會注意到焦點仍保留在同一控件中)。它只是控制的形式不活躍。如果您希望它在表單停用時保存更改,則必須手動觸發它。最好的方法是重寫窗體的OnDeactivate方法。

protected override void OnDeactivate(EventArgs e) 
    { 
     base.OnDeactivate(e); 

     this.ValidateChildren(); 
    } 
+0

感謝您的回覆。對我來說,問題仍然是:這是樹控制,網格控件等如何識別窗體焦點切換的方式,它們是否爲父窗體Deactivated事件提供處理程序,並且它們是否跟蹤ParentChanged事件上UserControl的更改。因爲,就像我的用例一樣,同一個UserControl對象可以在不同的表單之間移動。對我而言,解決這樣一個簡單問題的整個必要邏輯似乎很複雜...... –