Главная » Silverlight » Редактирование при двустороннем связывании

0

Что происходит, когда пользователь изменяет связанное значение, выведенное в тек­стовом элементе управления? Изменяется ли хранящийся в памяти объект Product, ког­да пользователь вводит новое описание продукта?

Рассмотрим код, извлекающий текущий объект Product из свойства DataContext и выводящий свойства объекта Product в текстовых полях.

Product product = (Product)gridProductDetails.DataContext; lblCheck.Text = "Model Name: " + product.ModelName + "\nModel Number: " + product.ModelNumber + "\nUnit Cost: " + product.UnitCost;

Выполнив данный код, вы увидите, что изменение выведенных значений ни на что не влияет. Объект Product остается прежним.

Это объясняется тем, что в данном примере используется одностороннее связыва­ние, установленное по умолчанию. Однако в Silverlight доступны и другие режимы свя­зывания, определяемые свойством Binding.Mode. В табл. 16.1 приведен полный список элементов перечисления System.Windows.Data.BindingMode, применяемых в свойстве Binding.Mode.

Таблица 16.1. Элементы перечисления BindingMode

Имя

OneWay

Описание

Целевое свойство обновляется при изменении свойства источника (режим одностороннего связывания)

TwoWay

Целевое свойство обновляется при изменении свойства источника, и, наоборот, свойство источника обновляется при изменении целевого свойства (режим двустороннего связывания)

OneTime

Целевое свойство устанавливается при инициализации на основе значения свойства источника; после этого изменения источника игнорируются; обычно режим OneTime используется для уменьшения накладных расходов, когда известно, что свойство источника не будет изменяться

При задании свойств выражения связывания кавычки не используются. Ниже при­веден пример установки двустороннего режима связывания.

«CTextBox Text=" {Binding UnitCost, M6de=TwoWay} "></TextBox>

Примечание. При двустороннем связывании объект, находящийся в оперативной памяти, не изменяется, пока текстовое поле не потеряет фокус. Однако другие элементы, отличные от текстового поля, обновляют источник немедленно. Например, при выделении элемента списка, перемещении ползунка, изменении состояния флажка и так далее источник немедленно обновляется.

В некоторых ситуациях необходимо управлять временем обновления. Например, ино­гда нужно, чтобы изменения вносились в текстовое поле, когда пользователь вводит или редактирует данные, не дожидаясь перехода фокуса. Для этого нужно вручную вызвать метод BindingExpression.UpdateSource () в коде. Ниже приведен код, вынуждающий текстовое поле обновлять объект-источник, когда пользователь вводит очередной символ.

private void txtUnitCost_TextChanged(object sender,

TextChangedEventArgs e)

{

BindingExpression expression = txtUnitCost.GetBindingExpression(TextBox.TextProperty); expression.UpdateSource() ;

}

Если все обновления выполняются посредством кода, можете с помощью свойства UpdatgeSourceTrigger объекта Binding отключить встроенную в Silverlight систему ав­томатического обновления.

CTextBox Text=

"{Binding UnitCost, Mode=TwoWay, UpdateSourceTrigger=Explicit}">c/TextBox>

Надстройка Silverlight поддерживает только два значения свойства

UpdateSourceTrigger — Default и Explicit. В WPF есть еще значение PropertyChanged. Добавив немного кода и метод UpdateSource (), можете и в Silverlight обеспечить обнов­ление в любой момент времени.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии