Есть ли у людей какие-либо рекомендации относительно того, когда простое свойство .NET, которое вызывает INotifyPropertyChanged.PropertyChanged
, достаточно в модели представления? Тогда когда вы хотите перейти к полноценному свойству зависимости? Или DP предназначены в основном для представлений?
Есть несколько подходов:
1. Свойство dependency
При использовании свойства dependency оно имеет наибольший смысл в элементах-классах, имеющих визуальный вид (UIElement
ы).
Плюсы:
Минусы:
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()
для обновления.
Первый и второй варианты наиболее вероятны в зависимости от того, какова ваша цель.
В целом, это визуальное сравнение с данными.
Насколько я знаю, DependencyProperty
требуется только тогда, когда вам нужно
и т. д.
Эти функции будут недоступны в обычных свойствах.