0

Я борюсь с зависимостью в управлении. Мой DependencyProperty это объект, который выглядит следующим образом:Объект DependencyProperty, не обновляющийся до UI

public class ChartGroupCollection : ObservableCollection<ChartGroup>, INotifyCollectionChanged 
{ 
    public void ClearDirty() 
    { 
     foreach (var grp in base.Items) 
     { 
      foreach(var run in grp.ChartRuns.Where(x=>x.IsDirty)) 
      { 
       run.IsDirty = false; 
      } 

      grp.IsDirty = false; 
     } 
    } 

    [XmlIgnore] 
    public bool IsDirty //dirty flag for save prompt 
    { 
     get 
     { 
      .... 
     } 
    } 

} 

[Serializable] 
public class ChartGroup : INotifyPropertyChanged 
{ ... //various properties } 

DependencyProperty устанавливается как здесь (названный Tree, который является экземпляром ChartGroupCollection):

public static readonly DependencyProperty TreeProperty = DependencyProperty.Register("Tree", typeof(ChartGroupCollection), typeof(ChartsControl), new PropertyMetadata(OnTreeChanged)); 
    public ChartGroupCollection Tree 
    { 
     get { return (ChartGroupCollection)GetValue(TreeProperty); } 
     set { SetValue(TreeProperty, value); } 
    } 
private static void OnTreeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var Treee = sender as ChartsControl; 
     if (e.OldValue != null) 
     { 
      var coll = (INotifyCollectionChanged)e.OldValue; 
      coll.CollectionChanged -= Tree_CollectionChanged; 
     } 
     if (e.NewValue != null) 
     { 
      var coll = (ObservableCollection<ChartGroup>)e.NewValue; 
      coll.CollectionChanged += Tree_CollectionChanged; 
     } 

    } 

    private static void Tree_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     (sender as ChartsControl).OnTreeChanged(); 
    } 

    void OnTreeChanged() 
    { 
     MessageBox.Show("Do something..."); //RefreshCharts(); 
    } 

Я, кажется, подобрались к Событие OnTreeChanged только при создании объекта, но как только я выполняю другую работу (добавление в списки внутри ChartGroup или изменение свойств объектов ChartGroup или даже удаление элементов наблюдаемого коллекций, похоже, никогда не вызывает событие обновления. Я пробовал несколько других методов получение зависимого свойства, найденного в сети, но никакое решение не работало для меня. Интересно, вниз к внутренней природе моего объекта DependencyProperty или ошибке с моей стороны

ответ

0

sender аргумента в вашем Tree_CollectionChanged обработчике не ChartsControl экземпляра, но коллекция, вызвавшее событие CollectionChanged.

Метод Tree_CollectionChanged не должен быть статичным

private void Tree_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    OnTreeChanged(); 
} 

и он должен быть присоединен и удален, как это:

private static void OnTreeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    var control = sender as ChartsControl; 
    var oldCollection = e.OldValue as INotifyCollectionChanged; 
    var newCollection = e.NewValue as INotifyCollectionChanged; 

    if (oldCollection != null) 
    { 
     oldCollection.CollectionChanged -= control.Tree_CollectionChanged; 
    } 

    if (newCollection != null) 
    { 
     newCollection.CollectionChanged += control.Tree_CollectionChanged; 
    } 
} 

Заметим также, что добавление обработчика CollectionChanged не заботится о подписке на события PropertyChanged элементов коллекции. Вам также необходимо будет прикрепить или удалить обработчик PropertyChanged всякий раз, когда элемент добавляется или удаляется из коллекции. Посмотрите на NotifyCollectionChangedEventArgs.Action собственности.

+0

Спасибо, вы правы насчет статичности. Я все еще придерживаюсь control.TileLayerCollectionChanged, что он делает и какой код мне нужно добавить, чтобы заставить его работать? создать метод заглушки? – GSammons

+0

Это был только экземпляр и вставка ошибки из моего кода. Тем временем я отредактировал ответ. – Clemens

+0

Спасибо за реальную скорость в ответе. Отлично – GSammons

Смежные вопросы