Hi all,
I'm creating a custom control (extending a datagrid). I would like to get a notification when items are added or removed from ItemsSource of the datagrid through ViewModel so I could call a certain method. I tried using a dependancy property but I'm only getting notification when ItemsSource is set a new Collection, not when items are added or removed.
So is it possible ? Thanks for any suggestions ..
Custom Control -
public class CustomDataGrid : DataGrid { private List<CheckBox> checkboxes = new List<CheckBox>(); private CheckBox headerCheckBox; public bool EnableSelectionColumn { get; set; } public bool EnableOneClickEdit { get; set; } private static readonly DependencyProperty ItemsSourceWatcherProperty = DependencyProperty.Register("ItemsSourceWatcher", typeof(object), typeof(CustomDataGrid), new PropertyMetadata(null, OnItemsSourceWatcherPropertyChanged)); private static void OnItemsSourceWatcherPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { CustomDataGrid source = d as CustomDataGrid; if (source != null) source.OnItemsSourceWatcherPropertyChanged(); } private void OnItemsSourceWatcherPropertyChanged() { // code to call when items changes } public CustomDataGrid() { if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) return; Binding b = new Binding("ItemsSource") { Source = this }; SetBinding(ItemsSourceWatcherProperty, b); } }
Xaml
<Custom:CustomDataGrid ItemsSource="{Binding Persons, Mode=TwoWay}" EnableSelectionColumn="True" ColumnWidth="*" SelectedItemsInDataGrid="{Binding SelectedItemsTest, Mode=TwoWay}" />
View Model
public class DatagridTest : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private ObservableCollection<Person> _persons; public ObservableCollection<Person> Persons { get { return _persons; } set { _persons = value; RaisePropertyChanged("Persons"); } } private ObservableCollection<object> _selectedItems; public ObservableCollection<object> SelectedItemsTest { get { return _selectedItems; } set { _selectedItems = value; RaisePropertyChanged("SelectedItemsTest"); } } public ICommand RemoveCommand { get; set; } public DatagridTest() { Persons = new ObservableCollection<Person>() { new Person("Smith", 24, DateTime.Today), new Person("John", 40, DateTime.Today.AddDays(-24)), new Person("Doe", 35, DateTime.Today.AddDays(5)) }; SelectedItemsTest = new ObservableCollection<object>(); RemoveCommand = new RelayCommand(Remove); } private void Remove(object obj) { //Persons = new ObservableCollection<Person>(); foreach (var item in SelectedItemsTest) { if (Persons.Contains((Person) item)) Persons.Remove((Person) item); } } }