Привязка данных (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>