2011-06-03 72 views
1

我只有在完成其所有初始數據綁定時,才需要更改某個DataGridView的屬性(用於其某個綁定的DataSourceUpdateMode)。我嘗試訂閱「DataBindingComplete」事件,但它被觸發了太多次(每個綁定關聯到控件一次或多次)。我需要的是一個更全局的「AllDataBindingsComplete」事件,當控件準備好顯示給用戶時觸發。Windows窗體綁定:是否有類似於DataBindingComplete的事件,但在所有綁定完成後觸發?

作爲臨時解決方法,我使用MouseDown事件(我假定當用戶能夠單擊控件時,這意味着控件顯示... :)以及事件我是的SelectionChanged - - 擺弄的鼠標按下解僱後):

protected override void OnMouseDown(MouseEventArgs e) 
    { 
     Binding selectedItemsBinding = this.DataBindings["SelectedItems"]; 
     if (selectedItemsBinding != null) 
     { 
      selectedItemsBinding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; 
     } 

     base.OnMouseDown(e); 
    } 

它的工作原理,但它聞起來像一個醜陋的劈了很多(這就是所謂的次數太多,只是一個時間足夠滿足我的需求)。

有沒有更好的方法?

(是的,我想採用MVVM在Windows窗體項目,我添加了一個可綁定「SelectedItems」屬性到DataGridView ...)

回答

4

我在Windows Forms已經做了形式級別,並且可以簡單地將它們簡化爲您想要的控件,就是將Windows窗體基類繼承到我自己的子類。然後,在其構造函數中,將附加的事件調用附加到Load()事件。

所以,當一切其他完全加載,纔將它打(的子類)我的自定義方法。由於它是連接到事件隊列的調用堆棧鏈的底部,所以我知道它是最後一切,其他所有事情都已完成......這是概念的一部分。

public class MyForm : Form 
{ 
    public MyForm() 
    { 
     this.Load += AfterEverythingElseLoaded; 
    } 

    private void AfterEverythingElseLoaded(object sender, EventArgs e) 
    { 
     // Do my own things here... 
    } 
} 

這一概念可以應用於Init()功能太多,如果這是更適合你的控制......讓一切在它得到初始化(),那麼你的「AfterInitialized()」函數。

+0

我想保持我的控制儘可能多的「容器不可知」,在內部處理所有這些東西。無論如何,我試圖從控件構造函數中獲取對父窗體的引用,但是this.FindForm()並不總是返回一個非空窗體(即使是在ParentChanged處理程序中調用它)。現在,我使用第一個「Enter」事件,它比「MouseDown」事件更好,因爲它甚至可以通過鍵盤導航來調用) – Notoriousxl 2011-06-03 18:22:21

+0

...最後,我遵循了您的建議(Load事件),將DataGridView封裝在用戶控件(具有Load事件)中,並將自定義可綁定屬性移動到它,而不是子類。 :) – Notoriousxl 2011-06-04 14:46:20

相關問題