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