我有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;但我不知道有什么可用。
答案 0 :(得分:4)
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;
}
}
答案 1 :(得分:2)
如果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;
}
}