WPF DependencyProperty和INotifyPropertyChanged

摘要:
WPF完成逻辑工作的某些机制(如动画)仅使用依赖属性FitsViewModel样式缺点:DependencyObjectvalue){if(timeline==null)thrownewArgumentNullException(“timeline”);value);typeof(DependencyObject),}set{name=value;

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

免责声明:文章转载自《WPF DependencyProperty和INotifyPropertyChanged》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity3D优化总结(一)android 设置字体颜色、EditText自己主动输入转换成大写字母的多种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

动态sql语句 入参中存在 数组 或 List

mybatis中入参存在 数组或List 时,使用foreach 进行动态拼接 foreach可以在SQL语句中迭代一个集合。它的属性主要有item、index、collection、separator、close、open item:表示集合中每一个元素进行迭代时的别名 index:指定一个名称,用于表示在迭代过程中,每次迭代到的位置 open:表示该...

deepin定制deepin-terminal

一. 背景介绍 本人以前在win10上经常使用xshell来登陆服务器。xshell提供了很丰富的功能和快捷键。个人比较喜欢的包括三个功能 终端透明 双击时根据分隔符选中文字 突出显示 但是自从使用deepin作为主力操作系统以后,固执地使用原创应用而非第三方应用的执念一直伴随着我。所以deepin-terminal成为我使用频率最高的应用。但是dee...

ADODB——RecordSet对象

转自网友,看着挺全就转了,供大家学习研究。 Recordset 对象的属性1、CursorType 属性 AdOpenForwardOnly: 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。(顾名思义,这种游标只能向前移动。然而,由于这种游标功能有限,将它用于系统资源时是非常有效的。) Ad...

Java属性中指定Json的属性名称(序列化和反序列化)

序列化对象,只需要使用注解"@JsonProperty(value = "pwd")" import com.fasterxml.jackson.annotation.JsonProperty; public class User{ @JsonProperty(value = "pwd") private String passw...

systabcontrol32

private void SelectTab() { IntPtr hand1 = FindWindowA(null, "EPSON R330 Series 打印首选项"); if (hand1 != IntPtr.Zero) {...

异步获取CMD命令行输出内容

当控制台命令使用process.Start(); 后可以直接显示输出内容,当然它是异步显示的不用等程序结束。代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using...