Несколько вызовов SetBinding из кода позади - PullRequest
1 голос
/ 13 сентября 2011

У меня есть несколько объектов C #, о которых нужно уведомлять при изменении свойства (свойство принадлежит FrameworkElement, например кнопке или списку).

Я скромно протестировал привязку одного объекта с помощью метода SetBindingвот так:

// DepOb is my FrameworkElement
// DepPropDesc is the DependencyPropertyDescriptor

System.Windows.Data.Binding bind = new System.Windows.Data.Binding();
bind.Source = this;
bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
bind.Path = new PropertyPath("Value");
bind.Mode = ob.BindingMode;
DepOb.SetBinding(DepPropDesc.DependencyProperty, bind);

Но когда я создаю второй объект и связываю его, первый больше не вызывается.Если я читаю между строк, метод устанавливает привязку , поэтому предыдущий сбрасывается, верно?

MSDN говорит об объекте «мультисвязывания», но я не знаю, как«получить» предыдущие привязки, хранящиеся в мульти-привязке, чтобы я мог добавить к ней новые привязки.

Я продолжу поиск, но я хотел посмотреть, есть ли у кого-нибудь здесь идеи о том, что я могу делать неправильно.

Заранее спасибо!

Себ

1 Ответ

2 голосов
/ 13 сентября 2011

Привязки устанавливаются ко второму объекту, который вы хотите привязать к первому объекту.При установке привязки для второго объекта значение, которое могло быть установлено для второго объекта, теряется, а значение для первого объекта становится доступным для чтения и записи (если установлено значение TwoWay).

grid2.SetBinding(FrameworkElement.WidthProperty, new Binding("ActualWidth") { Source = grid1 });

если у вас есть grid3, вы можете затем сделать:

grid3.SetBinding(FrameworkElement.WidthProperty, new Binding("ActualWidth") { Source = grid1 });

В этом примере WidthProperty - это статическое свойство только для чтения, определенное в gridE Framework 2, а grid3 наследуется от FrameworkElement, поэтому они могут использовать это свойство.

В вашем коде вам нужно написать что-то вроде этого (отметив BindingMode.OneWay в режиме).

System.Windows.Data.Binding bind = new System.Windows.Data.Binding();       
bind.Source = this;       
bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;       
bind.Path = new PropertyPath("Value");       
bind.Mode = BindingMode.OneWay;
DepOb.SetBinding(DepObClass.WidthOrSomethingProperty, bind);

Поскольку вы привязываетесь к экземпляру (DepOb), вам нужно определить фактическийсвойство (или использовать унаследованное) в определении класса, например:

public static readonly DependencyProperty WidthOrSomethingProperty = DependencyProperty.Register("WidthOrSomething", typeof(double), typeof(DepObClass), null);

В реализации DepObClass вы должны определить свое свойство следующим образом:

public double WidthOrSomething
{
     get { return GetValue(WidthOrSomethingProperty); }
     set { SetValue(WidthOrSomethingProperty, value); }
 }

Надеюсь, что это поможет.

...