Часто задаваемые вопросы по SilverLight - часть 2 - Объяснение одностороннего и двустороннего связываний
ОГЛАВЛЕНИЕ
Объяснение одностороннего и двустороннего связываний
Одностороннее связывание
Это название для характера поведения. В одностороннем связывании данные текут только из объекта в пользовательский интерфейс, а не наоборот. Например, у вас может быть текстовое поле с названием ‘TxtYear’, связанное с объектом, имеющим свойство ‘Year(год)’. Поэтому когда значение объекта меняется, это отразится в пользовательском интерфейсе Silverlight, но пользовательский интерфейс не может изменить свойство года в объекте.

Это процедура из трех этапов по реализации одностороннего связывания. Сначала создайте класс, который вы хотите связать с пользовательским интерфейсом Silverlight. Ниже приведен пример простого класса под названием ‘ClsDate’ со свойством ‘Year (год)’.
public class clsDate
{
private int _intYear;
public int Year
{
set
{
_intYear = value;
}
get
{
return _intYear;
}
}
На втором этапе необходимо связать свойство ‘Year’ с текстовым полем пользовательского интерфейса silver light. Чтобы связать свойство, нужно задать ‘связывание путь=Year’ в свойстве «текст» объекта пользовательского интерфейса текстовое поле. ‘Year’ – это свойство, которое связывается с объектом пользовательского интерфейса текстовое поле.
<TextBox x:Name="txtCurrentYear" Text="{Binding Path=Year}" Height="30" Width="150" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBox>
Последний этап – связывание контекста данных текстового поля с только что созданным объектом даты.
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
clsDate objDate = new clsDate();
objDate.Year = DateTime.Now.Year;
txtCurrentYear.DataContext = objDate;
}
}
Двустороннее связывание
Двустороннее связывание обеспечивает синхронизацию данных между пользовательским интерфейсом и объектами. Поэтому любое изменение в объекте отражается в интерфейсе, и любое изменение в интерфейсе отражается в объекте.
Чтобы реализовать двустороннее связывание, необходимо два дополнительных шага в дополнение к тем, которые предусмотрены для одностороннего связывания. Первое необходимое изменение – это задание режима как ‘TwoWay (двустороннего)’, как показано в следующем фрагменте кода XAML.
<TextBox x:Name="txtEnterAge" Text="{Binding Path=Age, Mode=TwoWay}" Height="30" Width="150" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBox> Второе необходимое изменение – реализация интерфейса ‘INotifyPropertyChanged (уведомление об изменении свойства)’. Ниже приведен класс, показывающий, как реализовать интерфейс ‘INotifyPropertyChanged’. Учтите, что нужно импортировать пространство имен ‘System.ComponentModel’.
public class clsDate : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _intYear;
public int Year
{
set
{
_intYear = value;
OnPropertyChanged("Year");
}
get
{
return _intYear;
}
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this,new PropertyChangedEventArgs(property));
}
}}
Связывание данных с контекстом данных – это обязательный шаг, который необходимо выполнить.
Что такое однократное связывание?
При однократном связывании данные перетекают из объекта в интерфейс только один раз. Отсутствует механизм отслеживания, обновляющий данные на обеих сторонах. Однократное связывание отличается повышенной производительностью по сравнению с двумя описанными ранее видами связывания. Такое связывание хорошо подходит для отчетов, когда данные загружаются только один раз и просматриваются.
<TextBox x:Name="txtEnterAge" Text="{Binding Path=Age, Mode=OneTime}" Height="30" Width="150" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBox> 