Привязка коллекции свойств зависимостей WPF - PullRequest
0 голосов
/ 28 апреля 2020

Я определил новый элемент управления в 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, но когда свойства фактически изменяются в наблюдаемой коллекции во время выполнения, этот обратный вызов никогда не вызывается. Это правильный способ обработки привязок к коллекциям, где вы хотите получать уведомления об изменениях свойств, происходящих для элементов в связанной коллекции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...