Привязка данных WPF: BindingOperations.SetBinding () не использует значение свойства зависимости - PullRequest
2 голосов
/ 11 июля 2011

У меня есть собственное свойство зависимости Target.Height, связанное с обычным свойством Source.Height с использованием BindingOperations.SetBinding().Обновление свойства Target.Height должно обновить свойство Source.Height.Но используется не фактическое значение свойства зависимости, а значение по умолчанию свойства зависимости.Это предполагаемое поведение?

Спасибо за любые подсказки.Код, который я использую:

public class Source
{
  private int m_height;
  public int Height
  {
    get { return m_height; }
    set { m_height = value; }
  }
}

public class Target : DependencyObject
{
  public static readonly DependencyProperty HeightProperty;

  static Target()
  {
    Target.HeightProperty =
      DependencyProperty.Register("Height", typeof(int), typeof(Target),
      new PropertyMetadata(666)); //the default value
  }

  public int Height
  {
    get { return (int)GetValue(Target.HeightProperty); }
    set { SetValue(Target.HeightProperty, value); }
  }
}



Source source = new Source();
Target target = new Target();

target.Height = 100;

Binding heightBinding = new Binding("Height");
heightBinding.Source = source;
heightBinding.Mode = BindingMode.OneWayToSource;

BindingOperations.SetBinding(target, Target.HeightProperty, heightBinding);

//target.Height and source.Height is now 666 instead of 100 ....

1 Ответ

2 голосов
/ 11 июля 2011

WPF помещает Binding в качестве значений свойств зависимостей. При настройке привязки вы фактически заменяете текущее значение свойства новым. В конце DependencyObject.SetValueCommon вы можете найти код, который это сделал. Там мы видим, что WPF получает значение по умолчанию, затем устанавливает его как текущее значение свойства с маркером выражения, а затем присоединяет BindingExpression, который обновляет источник, используя текущее значение свойства - значение по умолчанию.

this.SetEffectiveValue(entryIndex, dp, dp.GlobalIndex, metadata, expression, BaseValueSourceInternal.Local);
object defaultValue = metadata.GetDefaultValue(this, dp);
entryIndex = this.CheckEntryIndex(entryIndex, dp.GlobalIndex);
this.SetExpressionValue(entryIndex, defaultValue, expression);
DependencyObject.UpdateSourceDependentLists(this, dp, array, expression, true);
expression.MarkAttached();
expression.OnAttach(this, dp);
entryIndex = this.CheckEntryIndex(entryIndex, dp.GlobalIndex);
effectiveValueEntry = this.EvaluateExpression(entryIndex, dp, expression, metadata, valueEntry, this._effectiveValues[entryIndex.Index)]);
entryIndex = this.CheckEntryIndex(entryIndex, dp.GlobalIndex);
...