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

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

Ответы

Ответ 1

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

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

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

Если вам не нужно работать таким образом, это не нужно. например Если вы просто хотите установить значение константу через 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 и привязывается к нему через View:

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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