何时使用WPF依赖关系属性与INotifyPropertyChanged

前端之家收集整理的这篇文章主要介绍了何时使用WPF依赖关系属性与INotifyPropertyChanged前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
人们有什么指导,当一个简单的.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数据。

猜你在找的设计模式相关文章