2009-02-28 2 views
8

У меня есть такой WPF код привязки:OneWay связывания перестает работать после того как цель обновить вручную

TestModel source = new TestModel(); 
TestModel target = new TestModel(); 

Bind(source, target, BindingMode.OneWay); 

source.Attribute = "1"; 
AssertAreEqual(target.Attribute, "1"); 

target.Attribute = "foo"; 

source.Attribute = "2"; 
AssertAreEqual(target.Attribute, "2"); 

Второе утверждение не! Это кажется странным для меня.

Кроме того, я попробовал «OneWayToSource» вместо «OneWay», и все работает так, как ожидалось.

Bind(source, target, BindingMode.OneWayToSource); 

target.Attribute = "1"; 
AssertAreEqual(source.Attribute, "1"); 

source.Attribute = "foo"; 

target.Attribute = "2"; 
AssertAreEqual(source.Attribute, "2"); 

Другие детали:

void Bind(TestModel source, TestModel target, BindingMode mode) 
{ 
    Binding binding = new Binding(); 
    binding.Source = source; 
    binding.Path = new PropertyPath(TestModel.AttributeProperty); 
    binding.Mode = mode; 
    BindingOperations.SetBinding(target, TestModel.AttributeProperty, binding); 
} 

class TestModel : DependencyObject 
{ 
    public static readonly DependencyProperty AttributeProperty = 
     DependencyProperty.Register("Attribute", typeof(string), typeof(TestModel), new PropertyMetadata(null)); 

    public string Attribute 
    { 
     get { return (string)GetValue(AttributeProperty); } 
     set { SetValue(AttributeProperty, value); } 
    } 
} 

Что случилось с моим кодом?

ответ

13

Установка target.Attribute = "Foo"; очистили привязку.

MSDN:

не только динамические ресурсы и привязок работают на той же старшинства как местного значения, они действительно являются локальное значение, но с значением, отложенный. Одним следствием этого является то, что если вы имеют динамический ресурс или связывание в место для значения свойства, любое локальное значение, которое вы установили впоследствии заменяет динамическое связывание или связывания полностью. Даже если вы вызываете ClearValue, чтобы очистить локально установленное значение , динамический ресурс или привязка не будут восстановлены. Фактически, если вы вызовите ClearValue на свойство, которое имеет динамический ресурс или привязку на месте (без локального значения «literal»), они также очищаются вызовом ClearValue .

1

Не имеющий обязательной силы эксперт, но я считаю, что вы столкнулись с проблемами приоритета свойств зависимостей WPF. Вероятно, установка значения напрямую имеет приоритет над значением привязки. Вот почему он отменяет привязку.

Вот полный список свойства зависимостей: http://msdn.microsoft.com/en-us/library/ms743230.aspx

+0

Это означает, что значение, установленное в стиле style, переопределит значение шаблона, а локальное значение переопределит значение стиля и т. Д. Но у меня нет ничего такого. Поэтому не уверен, что это объясняет проблему ... Спасибо. – alex2k8

+0

Кроме того, это не объясняет разницу между OneWay и OneWayToSource – alex2k8

-1

Если вы задали Binding режим для OneWay, это означает, что привязка работает только в одну сторону: цель обновляется при изменении источника.

Но целью должно быть свойство зависимости, а у вас есть свойство CLR .NET. Вы должны установить значение для цели, используя имя зарегистрированного имени зависимостей, а не просто обычное имя свойства .NET. Ответ Джареда вполне прав, это может вызвать путаницу в разрешении конфликта между свойством зависимости WPF и обычным свойством .NET CLR.

Если вы следуете за соглашением, свойство зависимости должно быть в виде свойства «propertyname» +.

Пример: TextProperty - свойство зависимости Text для TextBox. Вызов их в коде должно быть:

TextBox1.TextProperty="value"; 

Для получения дополнительной информации о настройке источника Переплет:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

+0

Я добавил TestModel, чтобы избежать конфузации ... Также, пожалуйста, см. Мой метод привязки - я использую свойство зависимости WPF. Я использую оболочку свойств CLR, чтобы установить значение свойства WPF ... Кроме того, TextBox1.TextProperty = "value"; Что вы имеете в виду? Экземпляр TextBox имеет только свойство Text. – alex2k8

0

Пример: TextProperty является "Текст" свойство зависимости от TextBox. Вызвать их в коде должно быть:

TextBox1.TextProperty = "value";

WPF свойства можно задать двумя способами:. путем вызова метода DependencyObject.SetValue (например. Instance.SetValue (TextProperty, "какой-то текст")) или с помощью CLR Wrapper (например instance.Text =» некоторый текст ").

TextBox.TextProperty - это статический объект DependencyProperty, поэтому вы не можете назначить строковое значение ссылочному типу.

 Смежные вопросы

  • Нет связанных вопросов^_^