2014-02-06 2 views
0

Я использую привязку данных между 2 свойствами (целью привязки является свойство зависимостей). Если я изменю значение источника привязки, также будет изменена целевая ссылка (значение свойства зависимостей). Мой вопрос: как я могу обработать изменение стоимости свойства зависимостей?Как справиться с изменением стоимости свойства зависимостей?

Edit: Вот как я зарегистрировать свойство зависимостей:

public static DependencyProperty ItemsProperty = DependencyProperty.Register(
    ItemsPropertyName, 
    typeof(List<ModelItem>), 
    typeof(CentralPanel), 
    new UIPropertyMetadata(null, OnItemsChanged)); 

Так что, когда я ставлю точку останова в OnItemsChanged, метод работает только один раз, когда значение дребезжание источника устанавливается в первый раз. Затем, когда я изменяю значение источника привязки, значение цели привязки также изменяется, но OnItemsChanged не срабатывает, почему?

+0

Когда вы говорите _I изменить значение привязки source_ вам изменить весь список или элемент в списке? – dkozl

+0

@dkozl: Я меняю весь список. Разве это имеет значение? –

+0

'OnItemsChanged' запускается, только если вы установите его в другой экземпляр' List '. Он не будет вызываться, если будет тот же список, что вы добавляете или удаляете элементы из списка. – dkozl

ответ

0

Я на самом деле очистки списка и добавить новые элементы

OnItemsChanged будет срабатывать только если вы установите его в другой экземпляр List<ModelItem>. Он не будет запускаться, если он будет тем же самым списком, что вы добавляете или удаляете элементы из списка.

Если вы хотите, чтобы ваш список уведомлял пользовательский интерфейс с изменениями при добавлении/удалении элементов, он должен реализовать интерфейс INotifyCollectionChanged, или вы можете использовать готовую реализацию ObservableCollection<T> вместо List<T>.

Если вы хотите, чтобы поймать изменения в коллекции в коде вы можете подписаться на CollectionChanged событие

происходит, когда добавляется элемент, удален, изменен, перемещен или весь список обновляется.

Вы можете сделать это в OnItemsChanged обратного вызова:

private void OnItemsChanged(DependencyPropertyChangedEventArgs e) 
{ 
    var oldList = e.OldValue as ObservableCollection<ModelItem>; 
    if (oldList != null) oldList.CollectionChanged -= MyCollectionChangedCallback; 
    var newList = e.NewValue as ObservableCollection<ModelItem>; 
    if (newList != null) newList.CollectionChanged += MyCollectionChangedCallback; 
} 
+0

Позвольте мне проверить, если это помогает ... –

+0

Как подписаться на событие CollectionChanged? Мой стандартный способ улавливания изменений (точка останова в OnItemChanged) не работает, даже сейчас, когда новый экземпляр объекта задан как значение, и я изменил источник привязки и цель на ObservableCollection вместо List. –

+0

Когда вы используете 'ObservableCollection', вы продолжаете использовать только один экземпляр, и он уведомляет пользовательский интерфейс, когда элементы добавляются/удаляются. Поэтому, когда вы делаете 'var myList = new ObservableCollection (); myList.CollectionChanged + = MyCollectionChangedCallback; 'он вызывает' MyCollectionChangedCallback' каждый раз, когда вы добавляете/удаляете элементы в своей коллекции. – dkozl

0

Каждый вид сетки имеет набор функций событий, определенных в определении масштабирования в виде .aspx, и они обрабатываются в коде позади aspx.cs страницы.

EventArgs е параметр события содержит оба определения Старого и Новых Значения некоторого свойства: e.NewValues ​​[ «ИмениСвойство»]. это свойство позволяет обрабатывать измененное значение свойства dependcy.

С уважением, ANDOURA

+0

Да, это так. Но проблема в том, что OnItemsChanged, где я могу проверить значение e, запускается только один раз. Поэтому он показывает мне e.NewValue как значение и e.OldValue как null.Я уверен, что в следующий раз, когда он работает, он перекроет OldValue, но проблема в том, что событие запускается только один раз :) –

+0

попробуйте использовать следующий даже ** OnItemsSourceChanged **: 'открытое статическое только для чтения DependencyProperty ItemsSourceProperty = DependencyProperty.Register ("ItemsSource", TypeOf (IEnumerable), TypeOf (ItemsControl), новые FrameworkPropertyMetadata ((IEnumerable) нуль, новый PropertyChangedCallback (OnItemsSourceChanged))); частной статической силы ** OnItemsSourceChanged ** (DependencyObject d, DependencyPropertyChangedEventArgs е) ' { ** e.Old ** и ** ** e.New } – Ando

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