Когда использовать свойства зависимости - PullRequest
14 голосов
/ 05 ноября 2010

Мне иногда кажется, что я, возможно, использую свойства зависимости без необходимости. Когда мне нужно его использовать? Когда у меня есть свойство, которое зависит от других свойств? Скажем, у меня есть свойство 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 дополнительная строка во всех этих свойствах?

Ответы [ 4 ]

21 голосов
/ 05 ноября 2010

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

<local:MyObject MyDependencyProperty="{Binding ...}" />

Обновление: как упомянуто Ианом ниже,Свойства зависимостей также требуются, если вы хотите иметь возможность анимировать свое свойство или задать его с помощью стиля

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

<local:MyObject MyRegularProperty="Some Value" />

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

<TextBlock Text="{Binding MyViewModelProperty}" />

, тогда вам не нужно использовать 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
}

Затем в вашем ViewModel есть свойство Color, которое вызывает событие PropertyChanged и связывается с ним черезВзгляд:

<TextBlock Text="{Binding Color.Hue}" />

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

15 голосов
/ 05 ноября 2010

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

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

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

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

2 голосов
/ 24 октября 2012

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

0 голосов
/ 05 ноября 2010

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

Oh, и Equals и GetHashCode запечатаны: (

...