2010-04-05 2 views
2

Я не уверен, почему свойство не вызывается при привязке. Вот код:Почему свойство не вызвано привязкой в ​​WPF?

<myusercontrol 
Text ="{Binding Description, UpdateSourceTrigger=LostFocus,Mode=TwoWay, ValidatesOnDataErrors=True}" 
IsReadOnly ="{Binding AllowEditing}" 
/> 

А вот myusercontrol IsReadOnly свойство:

public static DependencyProperty IsReadOnlyProperty = DependencyProperty.Register("IsReadOnly", typeof (bool), 
                          typeof (
                           myusercontrol)); 


     public bool IsReadOnly 
     { 
      get 
      { 
       return ((bool) GetValue(IsReadOnlyProperty)); 
      } 

      set 
      { 
       MessageBox.Show(value.ToString()); 
       SetValue(IsReadOnlyProperty, !value); 
       OnPropertyChanged("IsReadOnly"); 
      } 
     } 

Окно сообщения никогда не отображается! Есть идеи!

ответ

5

Вы никогда не должны вводить какую-либо логику в свои устройства и устройства для определения свойств зависимостей, за исключением вызовов GetValue и SetValue. Это очень важно, потому что привязка XAML будет проходить напрямую через вызовы GetValue и SetValue, а не через ваше свойство кода! Вот почему вы никогда не видите MessageBox. Лучший подход заключается в добавлении метода обратного вызова с использованием метода DependencyProperty.Register (есть перегрузка для добавления обратного вызова). Затем этот метод будет вызываться всякий раз, когда значение изменяется, и вы можете поместить туда свою логику.

Другой вопрос: почему вы используете OnPropertyChanged? У свойств зависимостей есть встроенное уведомление об изменении, вам не нужно будет звонить OnPropertyChanged для них.

+0

Я использовал обратный вызов, но даже обратный вызов не запускается. – azamsharp

+0

Вы уверены, что привязка работает? Имеет ли ваше окно вывода какие-либо ошибки привязки? – Charlie

+0

Попробуйте это для отладки привязки: diag: PresentationTraceSources.TraceLevel = высокий, где diag определяется как пространство имен System.Diagnostics. – Charlie

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