当ItemsSource更改时,DataGrid NewItemPlaceholderPosition丢失

时间:2014-06-04 19:31:00

标签: c# wpf

我有两个DataGrids,并且在顶部网格OrdersGrid中选择一行,在底部网格DetailsGrid中显示有关OrdersGrid中所选行的一些详细信息

我希望两个网格NewItemPlaceholderPositionAtBeginning。对OrdersGrid来说这很容易,因为我可以在我的UserControl子类构造函数中设置它:

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

但问题是ItemsSource的{​​{1}}是DetailsGrid中当前所选项目的成员。

如果我为OrdersGrid设置NewItemPlaceholderPosition,那么它一直有效,直到我点击DetailsGrid中的新行,直到它回到默认值为OrdersGrid以来DetailsGrid 1}}从新的ItemsSource重新加载。

ItemsSource的{​​{1}}是名为OrdersGrid的{​​{1}},其中包含ObservableCollection类型的对象和{Orders Order对于当前ItemsSource,1}}是DetailsGrid,也是Order.Details

我认为我想要ObservableCollection Order事件,但我不确定这是正确的方法,甚至不知道如何解决这个问题。请帮忙!

1 个答案:

答案 0 :(得分:0)

我能够通过将以下内容添加到我的UserControl子类构造函数来解决此问题:

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

var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
if (dpd != null)
{
    dpd.AddValueChanged(DetailsGrid, DetailsSourceChanged);
}

使用DetailsSourceChanged方法定义如下:

private void DetailsSourceChanged(object sender, EventArgs e)
{
    if (DetailsGrid.Items.Count > 0)
    {
        ((IEditableCollectionView)DetailsGrid.Items).NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
    }
}