Когда использовать свойства зависимостей

Иногда я думаю, что я, возможно, без использования Dependency Properties. Когда мне нужно его использовать? Когда у меня есть свойство, которое зависит от других свойств? Скажем, у меня есть свойство Color которое я хочу, чтобы оно зависело от свойств Hue, Saturation, Luminosity, я использую свойство зависимости? Или что я использую? Я управляю им, привязанным к Color чтобы обновляться, когда свойства Hue, Saturation, Luminosity изменены.

пока что я сделал

 public byte Hue { get { return _hue; } set { if (_hue == value) return; _hue = value; NotifyPropertyChanged("Hue"); NotifyPropertyChanged("Color"); // to update controls bound to color } } 

Но я думаю, что это неправильный способ сделать что-то? Если у меня больше свойств, влияющих на цвет, у меня будет 1 дополнительная строка во всех этих свойствах?

Вы должны использовать DependencyProperty когда хотите привязать свое значение к чему-либо через XAML, например

  

Обновление: как упоминалось ниже в Ian, свойства зависимостей также необходимы, если вы хотите, чтобы иметь возможность анимировать ваше свойство или установить его в стиле

Если вам не нужно работать таким образом, это не нужно. Например, если вы просто хотите установить значение константу через XAML (как показано ниже), это будет работать без использования DependencyProperty

  

Аналогично, если вы хотите привязать значение свойства к (например) вашей модели представления:

  

то вам не нужно использовать DependencyProperty . Если вы реализуете INotifyPropertyChanged тогда Text будет по-прежнему обновляться при изменении свойства.

Редактирование: при повторном чтении вопроса я не уверен, будет ли затронута ваша ситуация, независимо от того, используете ли вы DependencyProperty или нет, – если я читаю ее правильно, все, что вы хотите сделать, это вызвать ряд свойств для обновляться в пользовательском интерфейсе, когда изменяется какое-либо из этих свойств, не так ли?

Я не думаю, что есть что-то неправильное в том, как вы реализуете вещи на данный момент (т. Е. Поднимаете много событий PropertyChanged в каждом сеттере), но если вы не заинтересованы в этом, вы можете попробовать иметь одно свойство, которое предоставляет соответствующие дочерние свойства для привязки к ним:

 class ColorWrapper { public Color Color { get; set; } public byte Hue { get { return this.Color.Hue; } //or however this is calculated } 

Затем у вас есть свойство Color на ViewModel, которое вызывает событие PropertyChanged и привязывается к нему через View:

  

Как я уже сказал, я бы не сказал, что это особенно улучшает то, что у вас уже есть.

Общие правила:

  • Для элементов управления XAML используйте свойства зависимостей;

  • Для данных (которые вы связываете в интерфейсе) используйте INotifyPropertyChanged .

Есть исключения, но они редки.

Другое использование свойств зависимостей – с навигационным журналом. Пользовательские свойства зависимостей на странице с флагом Juornal в метаданных включены в состояние, которое WPF сохраняет для страницы.

Помните, что свойства зависимостей, хотя они позволяют связывать либо как источник, либо цель, также являются streamочувствительными, и при сериализации вам придется использовать суррогат, сериализация, поскольку DependencyObject не является сериализуемым.

О, и Equals и GetHashCode запечатаны 🙁