2011-08-10 12 views
4

私はUserControl(InitializeComponentの後)のコンストラクタ関数でバインドするDataGridを持っています。WPF UserControlのために読み込まれた後にどのようなイベントが発生しますか?

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

私はItemContainerGenerator.ContainerFromIndexはnullを返し、それを行うたびしかし:ユーザーコントロールのためにロードされた場合には、私が実行ので、私は、それにいくつかの行にアクセスする必要があります。データグリッドがまだ完全に生成されていないように見えるので、その理論をテスト/確認するために、私は画面上にボタンを投げて、ボタンのクリックイベントで再びそのコードを実行し、価値。したがって、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のロードされたイベントが、同じ結果でそれをやってみました:。私も私が見つけたが、同じ結果を得た。このコードを試してみました

ありがとうございます!

あなたがロードより DispatcherPriority下でそのコードを実行することができます

答えて

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

、例えばInput

として、DataGridのLoadedイベントは、このようなものが含まれます

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

それはこれに応じて見えますarticle新しいフォームの最後のイベントはContentRenderedイベントになります。
しかし、これはarticleのように見えます。ユーザーコントロールの場合、最後のイベントはLoadedイベントになります。

ロードされたイベントの最後に小さな遅延を設定して、コードを実行して別のセパレーションを取得することがあります。

関連する問題