我是WPF的新手,我正在使用DataGrids,我需要知道属性ItemsSource何时被更改。
例如,我需要在执行此指令时必须引发事件:
dataGrid.ItemsSource = table.DefaultView;
或者添加行时。
我试过使用这段代码:
CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged);
但此代码仅在用户向集合中添加新行时才有效。因此,当整个ItemsSource属性发生任何更改时,我需要引发一个事件,因为整个集合被替换或者因为添加了一行。
我希望你能帮助我。提前谢谢
答案 0 :(得分:57)
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
方法。
您可以将此项用于任何依赖项属性,以便通知您有关更改的信息。
答案 1 :(得分:11)
这有什么帮助吗?
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();
}
}
}
答案 2 :(得分:-2)
如果您想要检测添加的新行,可以尝试DataGrid的InitializingNewItem
或AddingNewItem
事件。
InitializingNewItem
用法: