Привязка данных (Data Binding) в Silverlight - Вынесение общего кода во время добавления новых свойств
ОГЛАВЛЕНИЕ
Вынесение общего кода во время добавления новых свойств
В то время как мы добавляем новые свойства (bookAuthor, quantityOnHand и т.д.), каждый механизм установки должен проверить на наличие кого-либо, зарегистрированного в данном событии, и если найдет, то должен осуществить вызов. Копирование кода не очень приятная процедура: такой код сложнее масштабировать, и в данном случае высока вероятность ошибок. Мы вынесем ответственность в отдельный метод и заставим каждое свойство вызывать данный метод.
public class Book : INotifyPropertyChanged
{
private string bookTitle;
private string bookAuthor;
private int quantityOnHand;
private bool multipleAuthor;
private string authorURL;
private string authorWebPage;
private List<string> myChapters;
// реализация необходимого события для интерфейса
public event PropertyChangedEventHandler PropertyChanged;
public string Title
{
get { return bookTitle; }
set
{
bookTitle = value;
NotifyPropertyChanged("Title");
} // завершение установки
} // конец свойства
public string Author
{
get { return bookAuthor; }
set
{
bookAuthor = value;
NotifyPropertyChanged("Author");
} // завершение установки
}
public List<string> Chapters
{
get { return myChapters; }
set
{
myChapters = value;
NotifyPropertyChanged("Chapters");
}
}
public bool MultipleAuthor
{
get { return multipleAuthor; }
set
{
multipleAuthor = value;
NotifyPropertyChanged("MultipleAuthor");
} // завершение установки
}
public int QuantityOnHand
{
get { return quantityOnHand; }
set
{
quantityOnHand = value;
NotifyPropertyChanged("QuantityOnHand");
} // завершение установки
}
// factoring out the call to the event
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
Вынесением вызова PropertyChanged мы можем теперь передавать название любого свойства и повторно использовать данный шаблон для вызова делегата.
Отображение информации
Для того чтобы ясно и просто отобразить информацию, мы создадим форму с двумя колонками. Левая будет содержать подсказки, а правая - информацию:
Рис. 2-3. Отображаем свойства книги (Book)
На данный момент мы не будет беспокоиться о том, как мы получаем информацию о книге, и лишь сфокусируемся на ее отображении. Все ярлыки слева будут созданы при помощи TextBlocks. Два первых ярлыка справа также будут блоками текста, а за ними идут элементы ListBox, СheckBox и затем TextBox. Обратите внимание на разницу между TextBlock (являющейся ярлыком) и TextBox, который используется для ввода данных.
В предыдущей статье по элементам управления мы рассмотрели способ создания табличной сетки со строками и колонками, а также способ позиционирования данных элементов управления, и вы увидели способ вставки текста в элементы управления. Вот код для всех элементов, где вместо вопросительных знаков нам необходимо выполнить привязку данных.
<UserControl x:Class="BookProperties.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition MaxHeight="30" />
<RowDefinition MaxHeight="30" />
<RowDefinition MaxHeight="70" />
<RowDefinition MaxHeight="30" />
<RowDefinition MaxHeight="40" />
<RowDefinition MaxHeight="50" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="150"/>
<ColumnDefinition MaxWidth="200" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="TitlePrompt" Text="Title: "
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Grid.Row="0" Grid.Column="0" />
<TextBlock x:Name="Title"
Text="?"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Grid.Row="0" Grid.Column="1" />
<TextBlock x:Name="AuthorPrompt" Text="Author: "
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Grid.Row="1" Grid.Column="0" />
<TextBlock x:Name="Author"
Text="?"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Grid.Row="1" Grid.Column="1" />
<TextBlock x:Name="ChapterPrompt" Text="Chapters: "
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Grid.Row="2" Grid.Column="0" />
<ListBox x:Name="Chapters"
ItemsSource="?"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Height="60" Width="200"
Grid.Row="2" Grid.Column="1" />
<TextBlock x:Name="MultipleAuthorPrompt"
Text="Multiple authors?: "
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Grid.Row="3" Grid.Column="0" />
<CheckBox x:Name="MultipleAuthor"
IsChecked="?"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Grid.Row="3" Grid.Column="1"/>
<TextBlock x:Name="QOHPrompt"
Text="Quantity On Hand: "
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Grid.Row="4" Grid.Column="0" />
<TextBox x:Name="QuantityOnHand"
Text="?"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Height="30" Width="90"
Grid.Row="4" Grid.Column="1" />
</Grid>
</UserControl>