在DataGrid完成使用异步ItemsSource加载后执行某些操作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在DataGrid完成使用异步ItemsSource加载后执行某些操作?相关的知识,希望对你有一定的参考价值。
我有一个加载大量物品的DataGrid
,所以我将ItemsSource
设置为IsAsync=True
。
<DataGrid Name="OrdersGrid" ItemsSource="{Binding Path=Orders, IsAsync=True}" />
除了在我的NewItemPlaceHolderPosition
子类构造函数中更改UserControl
之外,一切似乎都能正常工作。
((IEditableCollectionView)OrdersGrid.Items).NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
我认为这会崩溃,因为你不能将它设置为空网格,这是我在异步ItemsSource
绑定之前所拥有的。
那么在我尝试更改DataGrid
之前,我应该把上面的行放在哪里以确保加载NewItemPlaceholderPosition
?我需要像“DataGridFinishedLoading”这样的东西,但我不知道有什么可用。
答案
Binding.NotifyOnTargetUpdated正是您要找的。
在绑定和钩子处理程序上将NotifyOnTargetUpdated
设置为true
,当Target(您的情况下为DataGrid)更新时需要调用它。
您可以查看args.Property
已通知哪个绑定。
XAML
<DataGrid Name="OrdersGrid"
ItemsSource="{Binding Path=Orders, IsAsync=True,
NotifyOnTargetUpdated=True}"
TargetUpdated="DataGrid_TargetUpdated"/>
代码背后
private void DataGrid_TargetUpdated(object sender, DataTransferEventArgs e)
{
if (e.Property == DataGrid.ItemsSourceProperty)
{
((IEditableCollectionView)OrdersGrid.Items).NewItemPlaceholderPosition =
NewItemPlaceholderPosition.AtBeginning;
}
}
另一答案
你可以检查Status
的ItemContainerGenerator
,如果它完成生成,如果Items
计数是0
。
public MainWindow()
{
var datagrid = new DataGrid();
datagrid.ItemContainerGenerator.StatusChanged += ItemContainerGeneratorOnStatusChanged;
}
private void ItemContainerGeneratorOnStatusChanged(object sender, EventArgs eventArgs)
{
var dataGrid = sender as DataGrid;
if (dataGrid == null) return;
if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
((IEditableCollectionView)OrdersGrid.Items).NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
}
}
以上是关于在DataGrid完成使用异步ItemsSource加载后执行某些操作?的主要内容,如果未能解决你的问题,请参考以下文章
在jQueryEasyui datagrid加载完成后清除选中