C# 更改DataGrid.ItemsSource时如何引发事件
我是WPF新手,正在使用DataGrids,我需要知道属性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
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
在应用程序的生命周期中保持对它的强引用。