Когда использовать свойство зависимости WPF по сравнению с INotifyPropertyChanged

Есть ли у людей какие-либо рекомендации относительно того, когда простое свойство .NET, которое вызывает INotifyPropertyChanged.PropertyChanged , достаточно в модели представления? Тогда когда вы хотите перейти к полноценному свойству зависимости? Или DP предназначены в основном для представлений?

35
задан Dave Clemmer 25 October 2013 в 18:37
поделиться

2 ответа

Есть несколько подходов:

1. Свойство dependency

При использовании свойства dependency оно имеет наибольший смысл в элементах-классах, имеющих визуальный вид (UIElementы).

Плюсы:

  • WPF делает логику за вас
  • Некоторые механизмы, такие как анимация, используют только свойство зависимости
  • "Подходит" под стиль ViewModel

Минусы:

  • Вам нужно вывести форму DependencyObject
  • Немного неудобно для простых вещей

Пример:

public static class StoryBoardHelper
{
    public static DependencyObject GetTarget(Timeline timeline)
    {
        if (timeline == null)
            throw new ArgumentNullException("timeline");

        return timeline.GetValue(TargetProperty) as DependencyObject;
    }

    public static void SetTarget(Timeline timeline, DependencyObject value)
    {
        if (timeline == null)
            throw new ArgumentNullException("timeline");

        timeline.SetValue(TargetProperty, value);
    }

    public static readonly DependencyProperty TargetProperty =
            DependencyProperty.RegisterAttached(
                    "Target",
                    typeof(DependencyObject),
                    typeof(Timeline),
                    new PropertyMetadata(null, OnTargetPropertyChanged));

    private static void OnTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Storyboard.SetTarget(d as Timeline, e.NewValue as DependencyObject);
    }
}

2. System.ComponentModel.INotifyPropertyChanged

Обычно, при создании объекта данных, вы используете этот подход. Это простое и аккуратное решение для Data-подобных вещей.

Плюсы и минусы - дополнительные 1. Вам нужно реализовать только одно событие (PropertyChanged).

Пример:

public class Student : INotifyPropertyChanged 
{ 
   public event PropertyChangedEventHandler PropertyChanged; 
   public void OnPropertyChanged(PropertyChangedEventArgs e) 
   { 
       if (PropertyChanged != null) 
          PropertyChanged(this, e); 
   } 
}

private string name; 
public string Name; 
{ 
    get { return name; } 
    set { 
           name = value; 
           OnPropertyChanged(new PropertyChangedEventArgs("Name")); 
        } 
} 

3.PropertyNameChanged

Возникает событие для каждого свойства с указанным именем (например, NameChanged). Событие должно иметь это имя, и вам решать, как обрабатывать/возбуждать их. Аналогичный подход, что и 2.

4. Получение привязки

Используя FrameworkElement.GetBindingExpression(), вы можете получить объект BindingExpression и вызвать BindingExpression.UpdateTarget() для обновления.

Первый и второй варианты наиболее вероятны в зависимости от того, какова ваша цель.

В целом, это визуальное сравнение с данными.

53
ответ дан 27 November 2019 в 06:55
поделиться

Насколько я знаю, DependencyProperty требуется только тогда, когда вам нужно

  1. наследование PropertyValue
  2. вам нужно разрешить установку свойства в установщиках стилей
  3. Использовать анимацию для свойства

и т. д.

Эти функции будут недоступны в обычных свойствах.

14
ответ дан 27 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: