C# 更改DataGrid.ItemsSource时如何引发事件

C# 更改DataGrid.ItemsSource时如何引发事件,c#,wpf,events,datagrid,C#,Wpf,Events,Datagrid,我是WPF新手,正在使用DataGrids,我需要知道属性ItemsSource何时更改 例如,我需要在执行此指令时引发一个事件: dataGrid.ItemsSource = table.DefaultView; 或者当添加一行时 我已尝试使用此代码: CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items); ((INotifyCollectionC

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

例如,我需要在执行此指令时引发一个事件:

dataGrid.ItemsSource = table.DefaultView;
或者当添加一行时

我已尝试使用此代码:

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged); 
但此代码仅在用户向集合中添加新行时有效。因此,我需要在整个ItemsSource属性发生任何更改时引发一个事件,无论是因为整个集合被替换还是因为添加了一行


我希望你能帮助我。提前感谢

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

在<代码>窗口中。已加载(或类似)您可以这样订阅:

var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
if (dpd != null)
{
    dpd.AddValueChanged(myGrid, ThisIsCalledWhenPropertyIsChanged);
}
并有一个更改处理程序:

private void ThisIsCalledWhenPropertyIsChanged(object sender, EventArgs e)
{
}
只要设置了
ItemsSource
属性,就会调用
this-whenPropertyChanged
方法

您可以将其用于任何需要通知更改的依赖项属性。

这有帮助吗

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

如果您想检测添加的新行,可以尝试DataGrid的
初始化NewItem
添加NewItem
事件

初始化新项目
用法:


您看过row_创建的活动吗?非常好!这正是我想要的。如果从标准控件继承,允许创建良好的控件行为!要记住的一件事是,如果不显式删除,此模式会造成严重的内存泄漏。源对象(
myGrid
,在这个答案中)永远不能被垃圾收集,因为静态的
dependencPropertyDescriptor
在应用程序的生命周期中保持对它的强引用。