ObservableCollection dependency property does not update when item in collection is deleted

后端 未结 3 1022
眼角桃花
眼角桃花 2020-12-09 02:58

I have a attached property of type ObservableCollection on a control. If I add or remove items from the collection, the ui does not update. However if I replace the collecti

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-09 03:50

    If you have a collection-type dependency property keep the following in mind:

    If your property is a reference type, the default value specified in dependency property metadata is not a default value per instance; instead it is a default value that applies to all instances of the type. [...]
    To correct this problem, you must reset the collection dependency property value to a unique instance, as part of the class constructor call.

    (see MSDN Collection-Type Dependency Properties)

    To answer Sam's question (I just ran into the same problem):

    Make your CollectionChanged-handler non-static and unsubscribe/re-subscribe on instance-level.

    private static void OnSpecialDaysChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      var calendar = d as RadCalendar;
    
      if (e.OldValue != null)
      {
        var coll = (INotifyCollectionChanged)e.OldValue;
        // Unsubscribe from CollectionChanged on the old collection of the DP-instance (!)
        coll.CollectionChanged -= calendar.SpecialDays_CollectionChanged;
      }
    
      if (e.NewValue != null)
      {
        var coll = (ObservableCollection)e.NewValue;
        calendar.DayTemplateSelector = new SpecialDaySelector(coll, GetSpecialDayTemplate(d));
        // Subscribe to CollectionChanged on the new collection of the DP-instance (!)
        coll.CollectionChanged += calendar.SpecialDays_CollectionChanged;
      }
    }
    
    private void SpecialDays_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        // handle CollectionChanged on instance-level
    }
    

提交回复
热议问题