在DataGrid完成使用异步ItemsSource加载后执行某些操作?

时间:2014-06-06 16:55:03

标签: wpf datagrid

我有DataGrid加载大量商品,因此我将ItemsSource设置为IsAsync=True

 <DataGrid Name="OrdersGrid" ItemsSource="{Binding Path=Orders, IsAsync=True}" />

除了更改NewItemPlaceHolderPosition子类构造函数中的UserControl之外,一切似乎都能正常工作。

((IEditableCollectionView)OrdersGrid.Items).NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;

我认为这会导致崩溃,因为您无法将其设置为空网格,这是我在异步ItemsSource绑定之前所拥有的。

那么在尝试更改DataGrid之前,我应该在上面哪一行确保加载NewItemPlaceholderPosition?我需要像&#34; DataGridFinishedLoading&#34;但我不知道有什么可用。

2 个答案:

答案 0 :(得分:4)

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;
    }
}

答案 1 :(得分:2)

如果Status生成完毕,您可以检查ItemContainerGeneratorItems计数是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;
    }
}