WPF DependencyProperty和INotifyPropertyChanged

DependencyProperty

使用依赖项属性时,在具有视觉外观(UIElements)的元素类中最有意义。
优点:

WPF完成逻辑工作
某些机制(例如动画)仅使用依赖项属性
Fits 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);
    }
}

System.ComponentModel.INotifyPropertyChanged

通常,在创建数据对象时,将使用这种方法。 这是一种简单而整洁的解决方案,适用于类似数据的内容。
使用时,只需实现一个事件(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")); 
    } 
} 

PropertyNameChanged

为具有指定名称(例如NameChanged)的每个属性引发一个事件。 活动必须使用此名称,与INotifyPropertyChanged类似的方法。

GetBindingExpression()

使用FrameworkElement.GetBindingExpression(),可以获取BindingExpression对象,并调用BindingExpression.UpdateTarget()进行刷新。

参考资料

When to use a WPF Dependency Property versus INotifyPropertyChanged

原文地址:https://www.cnblogs.com/Lulus/p/12499891.html