Односторонняя привязка работает, двусторонняя привязка не - PullRequest
0 голосов
/ 16 января 2012

В моем проекте Silverlight я создаю простую двустороннюю привязку в коде:

Это свойство, к которому я хочу привязать:

public class Selection : ViewModelBase {

    private string selectedModel;

    public string SelectedModel {
        get { return selectedModel; }
        set {
            selectedModel = value;
            FirePropertyChanged("SelectedModel");
        }
    }
}

Моей целью привязки является текстсвойство расширенного текстового поля.

Мой код привязки следующий:

Selection s = getSelectionObject();

Binding modelBinding = new Binding("SelectedModel");
modelBinding.Source = s.SelectedModel;
selectorContent.usc_ModelSelector.SetBinding(GSelector.TextProperty, modelBinding);

Это прекрасно работает!Каждый раз, когда свойство SelectedModel объекта Selection изменяется, поле расширенного текста получает уведомление и соответствующим образом обновляется.Но он связан только в одну сторону, и мне нужно, чтобы он был связан в двух направлениях.Поэтому я попытался изменить режим привязки, изменив приведенный выше код:

Binding modelBinding = new Binding("SelectedModel");
modelBinding.Path = new PropertyPath(s.SelectedModel);
modelBinding.Source = s.SelectedModel;
modelBinding.Mode = BindingMode.TwoWay;
selectorContent.usc_ModelSelector.SetBinding(GSelector.TextProperty, modelBinding);

Но это не работает.Он компилируется, но вся привязка теперь кажется безрезультатной.Мало того, что я не могу вызвать изменение в ViewModel (в классе Selection в свойстве SelectedModel - что должно быть эффектом, когда двусторонняя привязка будет работать правильно) при изменении текста RichTextBox, я даже не могусмотрите больше одностороннюю привязку, которая работала с приведенным выше кодом!

Кажется, что строка

modelBinding.Path = new PropertyPath(s.SelectedModel);

является источником проблемы, потому что когда я устанавливаю s.SelectedModel каксвойство Path bindings, а затем свойство Path объекта modelBinding, по-видимому, имеет правильное значение (при котором во время отладки был обнаружен внешний вид объекта во время отладки - это строковое значение), но я не вижу никаких изменений в поле расширенного текста,

Восстановление кода в версии односторонней привязки немедленно приводит к тому, что поле расширенного текста снова работает, как и должно.

Кто-нибудь может помочь?Я уже потратил на это несколько часов, и мне действительно нужно поймать крайний срок клиента. Поэтому любая помощь будет высоко оценена :) Большое спасибо заранее ...

1 Ответ

1 голос
/ 16 января 2012

This:

new Binding("SelectedModel");

Создает новую привязку с путем "SelectedModel".Затем вы продолжаете переписывать правильный путь этой строкой:

modelBinding.Path = new PropertyPath(s.SelectedModel);

, которая не будет работать; ссылка на конструктор сообщает:

Путь к свойству, который описывает путь к общеязыковому свойству времени выполнения (CLR) или одиночное свойство зависимости.

Поэтому используйте либо строку, либо ссылку на DP.

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

Редактировать: Ваш источник указан неверно!

Источником должен быть объект, содержащий свойство, здесь s.

Binding modelBinding = new Binding("SelectedModel");
modelBinding.Source = s;
modelBinding.Mode = BindingMode.TwoWay; // This might be optional depending on the default mode of the target property
...