2014-10-21 3 views
0

Я хочу создать привязку только один раз, но продолжать изменять ее Source.Change Binding Source Issue

Вот мой код.

public static readonly DependencyProperty TempDummyProperty = 
    DependencyProperty.Register("TempDummy", typeof(object), typeof(Helper), new PropertyMetadata(null)); 

public object Source 
{ 
    get; set; 
} 

public object GetValueFromBinding(object data) 
{ 
    if (this.BindingData == null) 
    { 
     Binding b = new Binding(); 
     b.Path = this.BindingPath; 
     b.Source = this.Source; 
     BindingOperations.SetBinding(this, TempDummyProperty, b); 
     this.BindingData = b; 
    } 

    this.Source = data; 
    BindingExpression be = BindingOperations.GetBindingExpression(this, TempDummyProperty); 
    be.UpdateTarget(); 
    return this.GetValue(TempDummyProperty); 
} 

Однако, когда я вызываю этот метод, я всегда возвращаю null.

GetValueFromBinding(this.DataContext); 

Кажется, что привязка не замечает, что источник был изменен.

Как получить это прямо, не создавая новый объект привязки?

ответ

0

A Binding - это просто описание привязки; это не применение привязки. Класс Binding является расширением разметки, которое создает BindingExpression и , что - это значение на основе выражения, которое применяется к свойству.

Изменение Binding не повлияет на существующие приложения этого связывания, а значение BindingExpression не может быть изменено после его применения.

Пара наблюдения о коде:

  1. Вы устанавливаете b.Source = this.Source, а потом обновить this.Source; это никак не повлияет на b.Source.

  2. UpdateTarget() сообщает привязке, чтобы вручную обновить значение свойства target из свойства источника. Он не будет проверять с помощью Binding, который произвел его и посмотрел, был ли источник изменен.

Если вы хотите сохранить Binding вокруг и обновить его Source, вам придется повторно использовать каждый раз, когда связывание (например, с SetBinding), или лежащий в основе BindingExpression не будет отражать изменения.

+0

Я изменяю свойство source моего вспомогательного объекта. Так же, как и обмен данными datacontext и привязка, все равно моя работа по обмену. Это не так :-( –

+0

Но вы даже не обновляете источник привязки ... см. Обновленный ответ. –

+0

Я знаю, что я не вопрос, как это сделать? –