Привязка OneWay перестает работать после обновления цели вручную - PullRequest
8 голосов
/ 28 февраля 2009

У меня есть такой код привязки WPF:

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); }
    }
}

Что не так с моим кодом?

Ответы [ 4 ]

13 голосов
/ 01 марта 2009

Установка цели. Атрибут = "foo"; очистил привязку.

MSDN:

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

1 голос
/ 28 февраля 2009

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

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

0 голосов
/ 03 августа 2009

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

TextBox1.TextProperty = "значение";

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

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

0 голосов
/ 28 февраля 2009

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

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

Если вы следуете соглашению, свойство зависимости должно быть в форме "propertyname" + property.

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

TextBox1.TextProperty="value";

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...