人们有什么指导,当一个简单的.NET属性触发INotifyPropertyChanged.PropertyChanged在视图模型中是否足够?然后什么时候你想移动到一个完全成熟的依赖属性?还是DP主要用于查看?
有几种方法:
依赖属性
在使用依赖属性时,它在元素 – 具有可视外观的类(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); } }
2. System.ComponentModel.INotifyPropertyChanged
通常,在创建数据对象时,您将使用此方法。它是简单和整洁的解决方案为类数据的东西。
优点和缺点 – 互补1.您只需要实现一个事件(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")); } }
3.PropertyNameChanged
为具有指定名称的每个属性升级事件(f.e。NameChanged)。事件必须有这个名字,它是由你来处理/提升他们。类似的方法2。
4.获取绑定
使用FrameworkElement.GetBindingExpression()可以获得BindingExpression对象
并调用BindingExpression.UpdateTarget()来刷新。
第一和第二是最有可能取决于你的目标是什么。
总而言之,它是视觉vs数据。