2012-05-22 7 views
25

Я новичок в WPF, и я работаю с DataGrids, и мне нужно знать, когда изменяется свойство 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(); 
     } 
    } 
} 
-1

Если вы wnat обнаружить новую строку добавляемые можно попробовать DataGrid в InitializingNewItem или AddingNewItem событие.

InitializingNewItem использование:

Datagrid auto add item with data of parent

Смежные вопросы