36

我是 WPF 的新手,我正在使用 DataGrids,我需要知道何时更改属性 ItemsSource。

例如,我需要在执行这条指令时触发一个事件:

dataGrid.ItemsSource = table.DefaultView;

或者当添加一行时。

我曾尝试使用此代码:

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged); 

但是此代码仅在用户向集合中添加新行时才有效。因此,我需要在整个 ItemsSource 属性发生任何更改时引发一个事件,无论是因为替换了整个集合还是添加了单行。

我希望你能帮助我。先感谢您

4

3 回答 3

70

ItemsSource是一个依赖属性,因此当属性更改为其他内容时很容易得到通知。除了您拥有的代码之外,您还想使用它,而不是:

Window.Loaded(或类似的)中,您可以像这样订阅:

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

并有一个变更处理程序:

private void ThisIsCalledWhenPropertyIsChanged(object sender, EventArgs e)
{
}

只要ItemsSource设置了属性,ThisIsCalledWhenPropertyIsChanged就会调用该方法。

您可以将其用于您希望收到更改通知的任何依赖项属性。

于 2012-05-22T19:45:39.287 回答
19

这有什么帮助吗?

public class MyDataGrid : DataGrid
{
    protected override void OnItemsSourceChanged(
                                    IEnumerable oldValue, IEnumerable newValue)
    {
        base.OnItemsSourceChanged(oldValue, newValue);

        // do something here?
    }

    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
    {
        base.OnItemsChanged(e);

        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Add:
                break;
            case NotifyCollectionChangedAction.Remove:
                break;
            case NotifyCollectionChangedAction.Replace:
                break;
            case NotifyCollectionChangedAction.Move:
                break;
            case NotifyCollectionChangedAction.Reset:
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}
于 2012-05-22T19:52:00.157 回答
-1

如果您想检测添加的新行,可以尝试 DataGridInitializingNewItemAddingNewItemEvent。

InitializingNewItem用法 :

Datagrid自动添加带有父数据的项目

于 2017-03-22T02:39:10.067 回答