我有一个DataGrid,我在UserControl的构造函数中绑定(在InitializeComponent之后)。我需要访问其中的一些行,因此在UserControl的加载事件中,我运行:
DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);
但是每当我这样做时,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);
}
我也尝试在DataGrid的加载事件中执行此操作,但结果相同。
谢谢!
答案 0 :(得分:5)
您可以在低于DispatcherPriority的情况下运行该代码,例如Input
例如,DataGrid的Loaded
事件将包含如下内容:
MyDataGrid.Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate() { RunSomeFunction(); } ));
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:0)