2013-02-25 2 views
3

У меня есть DependencyObject с DependencyProperty:связывания данных свойства зависимостей для объекта данных

public class DependencyObjectClass: DependencyObject 
{ 
    public static DependencyProperty BooleanValueProperty = DependencyProperty.Register("BooleanValue", typeof (bool), typeof (DependencyObjectClass)); 
    public bool BooleanValue 
    { 
     get { return (bool)GetValue(BooleanValueProperty); } 
     set { SetValue(BooleanValueProperty, value); } 
    } 
} 

У меня также есть источник данных класс:

public class DataSource: INotifyPropertyChanged 
{ 
    private bool _istrue; 
    public bool IsTrue 
    { 
     get { return _istrue; } 
     set 
     { 
      _istrue = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("IsTrue")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Я пытаюсь связать два вышеуказанных объектов с этот код:

var dependencyObject = new DependencyObjectClass(); 
var dataSource = new DataSource(); 
var binding = new Binding("IsTrue"); 
binding.Source = dataSource; 
binding.Mode = BindingMode.TwoWay; 
BindingOperations.SetBinding(dependencyObject, DependencyObjectClass.BooleanValueProperty, binding); 

Всякий раз, когда я изменить свойство BooleanValue на DependencyObjectClass, то Dat aSource реагирует, но он не работает наоборот (изменение свойства IsTrue на DataSource ничего не делает для DependencyObjectClass).

Что я делаю неправильно? Нужно ли вручную обрабатывать событие OnPropertyChanged? Если да, то это будет немного неутешительно, поскольку я ожидал, что это будет сделано автоматически.

+0

Вопрос только в том, что это за намерение? вы создаете настраиваемый элемент управления? –

+0

Я также обнаружил некоторую проблему с привязкой к свойствам bool. Если мы уведомляем о том же значении из VM в View, оно не отражается в setter DependencyProperty. Если у вас есть истинное значение IsTrue, а затем вы снова присваиваете ему true, то установщик DependencyProperty doesnt отражают его. Это означает, что если вы снова установите одно и то же значение, оно не будет отражено установщиком DependencyProperty. – ethicallogics

+0

HighCore, я в основном реализую шаблон MVVM для объектов, отличных от WPF. Я кодирую надстройку, где мне нужно использовать некоторые элементы пользовательского интерфейса сторонних разработчиков, поэтому я решил обернуть их в свои собственные классы, полученные из DependencyObject. Любые предложения приветствуются. – jur

ответ

2

изменение IsTrue собственность на DataSource ничего не делает для DependencyObjectClass

Я предполагаю, что вы заключаете это из-за того, что сеттер DependencyObjectClass.BooleanValue свойства не называются. На самом деле WPF этого не делает. Вместо этого он напрямую устанавливает значение свойства зависимостей, точно так же, как и для вызова SetValue.

См. Checklist for Defining a Dependency Property и Implications for Custom Dependency Properties для получения пояснения.

Чтобы получить уведомление об измененном значении свойства зависимостей, вам необходимо зарегистрировать PropertyChangedCallback с метаданными свойства зависимостей в DependencyProperty.Register.

+0

Спасибо! Мне не приходилось проверять значение, а не просто смотреть его аксессуар. – jur

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