2012-05-22 32 views
25

我是WPF中的新成員,我正在使用DataGrid,並且需要知道屬性ItemsSource何時更改。如何在DataGrid.ItemsSource更改時引發事件

例如,我需要的是執行該指令,當一個事件有加:

dataGrid.ItemsSource = table.DefaultView; 

或者當添加一行。

我曾嘗試使用此代碼:

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

但此代碼僅當用戶添加一個新行到集合中。因此,我需要在整個ItemsSource屬性發生任何更改時引發的事件,這可能是因爲整個集合被替換,或者因爲添加了單個行。

我希望你能幫助我。提前致謝

+0

你看着row_Created事件? – Limey

回答

52

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方法。

您可以將此用於任何您要通知有關更改的依賴項屬性。

+3

非常好!正是我在找什麼。 –

+0

如果從標準控件繼承,允許創建良好的控件行爲! – BendEg

+0

優秀的男人。節省了我的時間。 :) – shanmugharaj

8

這是否有幫助?

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(); 
     } 
    } 
} 
相關問題