加载WPF UserControl后会发生什么事件?

Nul*_*rty 4 c# wpf events datagrid

我有一个DataGrid,我绑定在UserControl的构造函数中(在InitializeComponent之后).我需要访问其中的一些行,所以在UserControl的加载事件中,我运行:

DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);
Run Code Online (Sandbox Code Playgroud)

但是每当我这样做时,ItemContainerGenerator.ContainerFromIndex都返回null.看起来像DataGrid还没有完全生成,所以为了测试/确认理论,我在屏幕上抛出一个按钮,然后在按钮的click事件上,我再次运行该代码,然后果然,行已经一个值.因此,已经确认,当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);
}
Run Code Online (Sandbox Code Playgroud)

我也尝试在DataGrid的加载事件中执行此操作,但结果相同.

谢谢!

Rac*_*hel 5

您可以在低于Loaded的DispatcherPriority下运行该代码,例如Input

例如,DataGrid的Loaded事件将包含如下所示的内容:

MyDataGrid.Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { RunSomeFunction(); } ));
Run Code Online (Sandbox Code Playgroud)


Nul*_*rty 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)