Здравствуйте, Аноним, Вы писали:
А>Хотелось бы понять как работает Binding, например когда я вызываю SetBinding то осуществляется подписка на изменение свойства или что-то еще из за чего данный код не работает?
По коду трудно понять из-за чего не работает Binding. Если в привязке есть какие-то ошибки, то при отладке они выводятся в окно Output.
А так, Binding кладется, как значение свойства. Т.е. приведенный код эквивалентен:
ctrl.SetValue(MyControl.MyItemsProperty, new Binding(){ Source = coll } );
Только это не означает, что GetValue на то же свойство вернет Binding. Результатом GetValue будет значение, на которое указывает привязка. В принципе не регламентируется, когда точно Binding должен сработать. Лучше представлять себе это так: когда значение свойства понадобится, тогда привязка будет задействована в первый раз, и тогда же будет произведена подписка на изменение источника. Впоследствии Binding будет реагировать на изменения и обновлять эффеткивное значение целевого свойства.
Есть некий 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 то осуществляется подписка на изменение свойства или что-то еще из за чего данный код не работает ?
Уберите IEnumerable, чем быстрее вы снимите очки OOP тем будет для вас лучше, инициализация произойдет. интересные вещи начинаются при изменениях коллекции. На последний момент тип совйства должен был быть ObservableCollection<T>, никаких рапперов. По поводу работы — никаких проблем, вот
статейка по теме.
Здравствуйте, 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>