2017-01-30 4 views
1

У меня есть пользовательский элемент управления, который сочетает в себе значения 2 DepedenciyProperties:WPF - доступ DependencyObject внутри события CollectionChanged

INT numberPeople и ингредиентам Перечисляются <>

Я хочу, чтобы когда-либо из этих значений обновления для повторной комбинации. В моей текущей реализации используется статическая переменная для отслеживания экземпляра объекта (objectInstance). Мне интересно, есть ли более чистый способ сделать это.

private static DependencyObject objectInstance; 

    public int numberPeople 
    { 
     get { return (int)GetValue(numberPeopleProperty); } 
     set { SetValue(numberPeopleProperty, value); } 
    } 
    public static readonly DependencyProperty numberPeopleProperty = 
     DependencyProperty.Register("numberPeople", typeof(int), typeof(ListDisplayer), new PropertyMetadata(0, Combine)); 


    public ObservableCollection<ListModel> ingredients 
    { 
     get { return (ObservableCollection<ListModel>)GetValue(ingredientsProperty); } 
     set { SetValue(ingredientsProperty, value); } 
    } 
    public static readonly DependencyProperty ingredientsProperty = 
     DependencyProperty.Register("ingredients", typeof(ObservableCollection<ListModel>), typeof(ListDisplayer), new PropertyMetadata(null, AssignCollectionChangedToList)); 
    private static void AssignCollectionChangedToList(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var instance = d as ListDisplayer; 
     if (e.OldValue != null) 
     { 
      var coll = (INotifyCollectionChanged)e.OldValue; 
      coll.CollectionChanged -= ItemsSource_CollectionChanged; 
     } 

     if (e.NewValue != null) 
     { 
      instance.ItemsSource = (ObservableCollection<ListModel>)e.NewValue; 
      objectInstance = instance; 
      instance.ItemsSource.CollectionChanged += ItemsSource_CollectionChanged; 
     } 
    } 

    private static void ItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // MY PROBLEM: when a new item is added in this list trigger again Combine(), is there 
     // another way to trigger the Combine so that it will process the IngredientList and numberPeople attached to the object ? 
     Combine(objectInstance, new DependencyPropertyChangedEventArgs()); 

    } 




    private static void Combine(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     // process numberPeople and ingredientList 
    } 

ответ

2

Edit: Удалите static ключевое слово из определения обработчика ItemsSource_CollectionChanged событий и подключить его с помощью «экземпляра» ссылка:

private static void AssignCollectionChangedToList(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var instance = d as ListDisplayer; 
    if (e.OldValue != null) 
    { 
     var coll = (INotifyCollectionChanged)e.OldValue; 
     coll.CollectionChanged -= instance.ItemsSource_CollectionChanged; 
    } 

    if (e.NewValue != null) 
    { 
     instance.ingredients = (ObservableCollection<ListModel>)e.NewValue; 
     objectInstance = instance; 
     instance.ingredients.CollectionChanged += instance.ItemsSource_CollectionChanged; 
    } 
} 

private void ItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    Combine(this, new DependencyPropertyChangedEventArgs()); 
} 

Также в CLR оберток ваших свойств зависимостей являются неправильно реализованы. Вы должны передать свойство зависимостей методам GetValue и SetValue:

public int numberPeople 
{ 
    get { return (int)GetValue(numberPeopleProperty); } 
    set { SetValue(numberPeopleProperty, value); } 
} 
public static readonly DependencyProperty numberPeopleProperty = 
    DependencyProperty.Register("numberPeople", typeof(int), typeof(ListDisplayer), new PropertyMetadata(0, Combine)); 


public ObservableCollection<ListModel> ingredients 
{ 
    get { return (ObservableCollection<ListModel>)GetValue(ingredientsProperty); } 
    set { SetValue(ingredientsProperty, value); } 
} 
public static readonly DependencyProperty ingredientsProperty = 
    DependencyProperty.Register("ingredients", typeof(ObservableCollection<ListModel>), typeof(ListDisplayer), new PropertyMetadata(null, AssignCollectionChangedToList)); 
+0

обновил код и комментарии по моему вопросу из кода. Комментарии теперь находятся внутри метода ItemsSource_CollectionChanged. Надеюсь, мне удалось объяснить, в чем мой вопрос на этот раз. –

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