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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM