Я определил новый элемент управления в wpf со следующим свойством зависимости
public static readonly DependencyProperty VehiclesProperty =
DependencyProperty.Register(nameof(Vehicles), typeof(IEnumerable<object>), typeof(VehicleControl), new PropertyMetadata(null, OnPropertyChanged));
public IEnumerable<object> Vehicles
{
get => (IEnumerable<object>)GetValue(VehiclesProperty);
set => SetValue(VehiclesProperty, value);
}
, а в модели представления, которая привязывается к указанному выше свойству зависимости, я определяю ObservableCollection
, например,
public ObservableCollection<IVehicleViewModel> Vehicles { get; set; }
, который устанавливается следующим образом
Vehicles= new ObservableCollection<IVehicleViewModel>();
Vehicles.Add(new VehicleViewModel());
Теперь я хочу уведомить свой элемент управления таким образом, что обратный вызов OnPropertyChanged
вызывается, если элементы добавляются или удаляются из наблюдаемая коллекция Vehicles
или если свойство изменяется в элементах (IVehicleViewModel
), составляющих наблюдаемую коллекцию Vehicles
. Свойства в IVehicleViewModel
все свойства повышения уведомлений изменяют события, и поэтому после этого SO ответа я попытался сделать следующее в элементе управления
private static void OnPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
if (!(dependencyObject is VehiclesControl vehiclesControl))
{
throw new InvalidCastException($"Dependency object must be of type {typeof(vehiclesControl)}");
}
if (eventArgs.OldValue is INotifyCollectionChanged oldCollectionChanged)
{
oldCollectionChanged.CollectionChanged -= vehiclesControl.OnItemsCollectionChanged;
}
if (eventArgs.NewValue is INotifyCollectionChanged newCollectionChanged)
{
newCollectionChanged.CollectionChanged += vehiclesControl.OnItemsCollectionChanged;
}
if (eventArgs.OldValueis INotifyPropertyChanged oldPropertyChanged)
{
oldPropertyChanged.PropertyChanged -= vehiclesControl.OnItemPropertyChanged;
}
if (eventArgs.NewValue is INotifyPropertyChanged newPropertyChanged)
{
newPropertyChanged.PropertyChanged += vehiclesControl.OnItemPropertyChanged;
}
}
private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
//Thought this would get hit?
}
Теперь, когда привязка происходит, кажется, что код попадает в строку, которая регистрирует событие обратного вызова ItemPropertyChanged
, но когда свойства фактически изменяются в наблюдаемой коллекции во время выполнения, этот обратный вызов никогда не вызывается. Это правильный способ обработки привязок к коллекциям, где вы хотите получать уведомления об изменениях свойств, происходящих для элементов в связанной коллекции?