Я полностью смоделировал ваш пример, и в основном вы ожидаете, что произойдет событие изменения свойства для изменений содержимого ObservableCollection. Ваш обработчик событий срабатывает только в случае замены самой коллекции, тогда как вы заменяете только дочерние элементы, а не коллекцию.
Единственный фрагмент вашего кода, который получит удар - это геттер:
get { return (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty); }
Может быть более изящный способ привязки событий к динамически создаваемым свойствам, но это будет работать:
public ObservableCollection<FilterableDataGridColumn> Columns
{
get
{
var columns = (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty);
columns.CollectionChanged -= columns_CollectionChanged; // Disconnect each time we reconnect
columns.CollectionChanged += columns_CollectionChanged;
return columns;
}
set
{
var columns = (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty);
if (columns != null)
{
columns.CollectionChanged -= columns_CollectionChanged; // Disconnect each time we change collection
}
SetValue(ColumnsProperty, value);
}
}
void columns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// This will get hit
}
Это добавляет в коллекцию хандер CollectionChanged
, а не прослушивает замену самой коллекции.
* Вы заметите, что сеттер пытается удалить хандера из любой предыдущей коллекции. Это мера «на всякий случай», так как в противном случае коллекция, отсоединенная от этого свойства, все равно будет сообщать об изменениях после удаления. Это не обязательно, чтобы заставить его работать для начальной коллекции, которую добавляет ваша собственность