在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;
    }
}
另一答案

你可以检查StatusItemContainerGenerator,如果它完成生成,如果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加载后执行某些操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Gridx

使用 Web 服务的异步方法

在jQueryEasyui datagrid加载完成后清除选中

Dojox.grid.DataGrid 过滤

EasyUI 使用tabs切换后datagrid显示不了内容

在多线程环境中更新 DataGrid 视图