Как работат Binding + DependencyProperty ?
От: Аноним  
Дата: 25.04.11 17:44
Оценка:
Есть некий UserControl, в котором описано DependencyProperty :


public class MyControl : UserControl
{
   public static readonly MyItemsProperty = DependencyProperty.Register( "MyItems", typeof( IEnumerable<MyObject> ), typeof( MyControl ) );

   public IEnumerable<MyObject> MyItems 
   {
      get{ return (IEnumerable<MyObject>)GetValue( MyItemsProperty );
      set{ SetValue( MyItemsProperty, value ); }
   }
}


Далее в коде данный контрол создается динамически и к нему привязывается коллекция


var coll = new ObservableCollection<MyObject>();
..

MyControl ctrl = new MyControl();
ctrl.SetBinding( MyControl.MyItemsProperty, new Binding(){ Source = coll } );


Но значение свойству не присваивается, почему-то даже не происходит попытки его инициализировать ( если вставить в binding IValueConvertor, то не вызывается ни Convert, ни ConvertBack ).

Хотелось бы понять как работает Binding, например когда я вызываю SetBinding то осуществляется подписка на изменение свойства или что-то еще из за чего данный код не работает ?
Re: Как работат Binding + DependencyProperty ?
От: DmitryMS  
Дата: 25.04.11 18:22
Оценка:
Уберите IEnumerable, чем быстрее вы снимите очки OOP тем будет для вас лучше, инициализация произойдет. интересные вещи начинаются при изменениях коллекции. На последний момент тип совйства должен был быть ObservableCollection<T>, никаких рапперов. По поводу работы — никаких проблем, вот статейка по теме.
Re: Как работат Binding + DependencyProperty ?
От: MxMsk Португалия  
Дата: 25.04.11 18:36
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Хотелось бы понять как работает Binding, например когда я вызываю SetBinding то осуществляется подписка на изменение свойства или что-то еще из за чего данный код не работает?

По коду трудно понять из-за чего не работает Binding. Если в привязке есть какие-то ошибки, то при отладке они выводятся в окно Output.

А так, Binding кладется, как значение свойства. Т.е. приведенный код эквивалентен:
ctrl.SetValue(MyControl.MyItemsProperty, new Binding(){ Source = coll } );

Только это не означает, что GetValue на то же свойство вернет Binding. Результатом GetValue будет значение, на которое указывает привязка. В принципе не регламентируется, когда точно Binding должен сработать. Лучше представлять себе это так: когда значение свойства понадобится, тогда привязка будет задействована в первый раз, и тогда же будет произведена подписка на изменение источника. Впоследствии Binding будет реагировать на изменения и обновлять эффеткивное значение целевого свойства.
Re[2]: Как работат Binding + DependencyProperty ?
От: Аноним  
Дата: 26.04.11 03:14
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, Аноним, Вы писали:


А>>Хотелось бы понять как работает Binding, например когда я вызываю SetBinding то осуществляется подписка на изменение свойства или что-то еще из за чего данный код не работает?

MM>По коду трудно понять из-за чего не работает Binding. Если в привязке есть какие-то ошибки, то при отладке они выводятся в окно Output.

MM>А так, Binding кладется, как значение свойства. Т.е. приведенный код эквивалентен:

MM>
MM>ctrl.SetValue(MyControl.MyItemsProperty, new Binding(){ Source = coll } );
MM>

MM>Только это не означает, что GetValue на то же свойство вернет Binding. Результатом GetValue будет значение, на которое указывает привязка. В принципе не регламентируется, когда точно Binding должен сработать. Лучше представлять себе это так: когда значение свойства понадобится, тогда привязка будет задействована в первый раз, и тогда же будет произведена подписка на изменение источника. Впоследствии Binding будет реагировать на изменения и обновлять эффеткивное значение целевого свойства.

Спасибо.

Кстати SetValue у меня ругнулось, что Binding не соответствует ожидаемому типу. Видимо он тупо присваивает свойству то что передают в параметре.
У себя ошибку нашел — проглядел что тип в регистрации DependencyProperty отличается от IEnumerable<MyObject>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.