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
标签:PropertyChanged,INotifyPropertyChanged,DependencyProperty,timeline,public,static 来源: https://blog.51cto.com/u_15180952/2732415