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
