2013-10-02 6 views
1

Пытаясь понять, как этот код работает:Как работают свойства зависимостей?

Создать свойство зависимостей,

public int YearPublished 
{ 
    get { return (int)GetValue(YearPublishedProperty); } 
    set { SetValue(YearPublishedProperty, value); } 
} 

public static readonly DependencyProperty YearPublishedProperty = 
    DependencyProperty.Register(
     "YearPublished", 
     typeof(int), 
     typeof(SimpleControl), 
     new PropertyMetadata(2000)); 

Затем используйте его в форме,

<xmlns:local="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<StackPanel> 
    <local:SimpleControl x:Name="_simple" /> 
    <TextBlock Text="{Binding YearPublished, ElementName=_simple}" 
       FontSize="30" 
       TextAlignment="Center" /> 
    <Button Content="Change Value" 
      FontSize="20" 
      Click="Button_Click_1"/> 
</StackPanel> 

Тогда для Button_Click_1 сделать,

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    _simple.YearPublished++; 
} 

Это работает. Каждый раз, когда вы нажимаете кнопку, номер должен быть изменен из PropertyMetadata - с 2000 ++, но также я видел его в форме в textBox.

Вопрос: Почему?

Если я не ставил код для обновления TextBlock в основной форме, он автоматически обновляется или есть какой-то скрытый механизм для него? Или, может быть, я не совсем понимаю, как это работает. Или, может быть, если в его собственности есть функции, которые обновляют номер в форме.

ответ

2

При создании DependencyProperty,

DependencyProperty.Register(
    "YearPublished", 
    typeof(int), 
    typeof(SimpleControl), 
    new PropertyMetadata(2000)); 

на основе YearPublished собственности, вы в основном его регистрацию в рамках DependencyProperty таким образом, что каждый раз, когда свойство чтения или написано, уведомляет всех подписчиков о событии, которое имело место. Вы регистрируете его, указав имя свойства, то есть "YearPublished", тип свойства, тип элемента управления, в котором находится свойство, и в этом случае начальное значение 2000.

Связывая его с TextBlock,

<TextBlock Text="{Binding YearPublished, ElementName=_simple}" /> 

вы позволяете текстовый блок знать, когда изменения свойств, поэтому он может обновлять себя. Когда свойство YearPublished изменяется, оно уведомляет текстовый блок этого изменения, которое, в свою очередь, получает обновленное значение и обновляет его свойство Text.

Это очень высокий уровень, однако достаточно, чтобы использовать его правильно. Чтобы лучше понять внутренности, взгляните на это MSDN post.

1

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

проверка this overview

+0

Итак, если я использую 'Text = {{Binding YearPublished, ElementName = _simple}" 'Автоматическое связывание, добавьте отражающий эффект на изменения? – gbk

+0

oh, found 'Когда привязка установлена ​​и данные изменяются, элементы пользовательского интерфейса, привязанные к данным, могут автоматически отражать изменения.' Http://msdn.microsoft.com/en-us/library/cc278072(v = vs.95) .aspx – gbk

Смежные вопросы