2011-08-10 30 views
4

我有一個DataGrid,我將其綁定在UserControl的構造函數中(在InitializeComponent之後)。我需要訪問它的一些行,因此在用戶控件加載的情況下,我跑:加載WPF UserControl後會發生什麼事件?

DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx); 

但是每當我這樣做,ItemContainerGenerator.ContainerFromIndex返回null。看起來像DataGrid尚未完全生成,所以爲了測試/確認理論,我在屏幕上扔了一個按鈕,並在按鈕的單擊事件中,我再次運行該代碼,然後果然,該行已經一個值。所以,經過確認,當UserControl的加載事件觸發時,它發生得太早,我還無法爲我的DataGrid調用ItemContainerGenerator.ContainerFromIndex。

加載後我可以用什麼事件觸發?

注意:我也試過這個代碼,我發現,但得到了同樣的結果:

DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx); 
if (row == null) 
{ 
    myDataGrid.UpdateLayout(); 
    myDataGrid.ScrollIntoView(myDataGrid.Items[rowIdx]); 
    row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx); 
} 

而且我也試圖在DataGrid的加載事件,但同樣的結果做。

謝謝!

回答

4

謝謝大家!這結束了伎倆:

myDataGrid.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged); 
: 
: 
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) 
{ 
    if (myDataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
    { 
     DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx); 
     if (row == null) 
     { 
      myDataGrid.UpdateLayout(); 
      myDataGrid.ScrollIntoView(myDataGrid.Items[rowIdx]); 
      row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx); 
     } 
    } 
} 
6

您可以運行在比加載下DispatcherPriority的代碼,如Input

例如,DataGrid的Loaded事件將包含的東西看起來是這樣的:

MyDataGrid.Dispatcher.BeginInvoke(DispatcherPriority.Input, 
    new Action(delegate() { RunSomeFunction(); })); 
0

它根據這個樣子article新窗體上的最後一個事件將是ContentRendered事件。
但是它看起來像這個article,對於usercontrol,最後一個事件是Loaded事件。

您可能會嘗試在加載事件結束時設置一個延遲時間較長的計時器來運行代碼以獲得分離。

相關問題