【问题标题】:Do something after DataGrid finished loading with async ItemsSource?在 DataGrid 使用异步 ItemsSource 完成加载后做些什么?
【发布时间】:2014-06-06 16:55:02
【问题描述】:

我有一个DataGrid 可以加载大量项目,因此我将ItemsSource 设置为IsAsync=True

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

除了在我的 UserControl 子类构造函数中更改 NewItemPlaceHolderPosition 之外,一切似乎都运行良好。

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

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

那么在我尝试更改NewItemPlaceholderPosition 之前,我应该将上述行放在哪里以确保DataGrid 已加载?我需要像“DataGridFinishedLoading”这样的东西,但我不知道有什么可用的。

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

    Binding.NotifyOnTargetUpdated 就是你要找的。​​p>

    在您的绑定和挂钩处理程序上将 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以检查ItemContainerGeneratorStatus 是否已完成生成以及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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 2023-03-16
        • 1970-01-01
        • 2020-05-19
        • 2018-07-24
        • 1970-01-01
        相关资源
        最近更新 更多