Property和Dependency Property之间有什么区别

36 c# silverlight wpf dependency-properties

依赖项属性的创建方式与属性相同.

是否仅在创建自定义控件时使用依赖项属性?

Ant*_*nes 58

依赖属性和标准属性是完全不同的.

依赖项属性提供的关键功能是对绑定和动画的支持.如果要使用Binding或模板绑定为属性分配值,则该属性需要是依赖项属性.在为属性设置动画时,依赖项属性可以跟踪当前指定的值和当前的动画值.

另一个经常被忽视的优点是只有分配了值的属性才需要存储.典型的控件可以具有很多属性,但是它的罕见代码为所有属性分配了一个新值,实际上,大多数属性都保留了默认值,实际设置的只有少数.使用依赖项属性时,默认值将存储为与属性相关的元数据,如果属性保持未分配状态,则不需要为每个控件实例分配任何内存.

依赖属性不仅限于控件(任何派生自DependencyObject可以拥有它们的东西),但它是在控件上或至少FrameworkElements在它们最有用的地方.

  • +1:这得到我的投票*它实际上回答了问题*! (10认同)

Kis*_*mar 22

依赖属性的优点

事实上,依赖属性比普通的CLR属性有很多优点.

  1. 属性值继承:按属性值继承我们的意思是可以在层次结构中覆盖Dependency属性的值,以便最终设置具有最高优先级的值.
  2. 数据验证:我们可以强制数据验证在修改属性值时自动触发.
  3. 参与动画:依赖属性可以动画.WPF动画具有许多以一定间隔更改值的功能.定义依赖项属性,最终可以为该属性支持动画.
  4. 参与样式:样式是定义控件的元素.我们可以在Dependency属性上使用Style Setters.
  5. 参与模板:模板是定义元素整体结构的元素.通过定义Dependency属性,我们可以在模板中使用它.
  6. DataBinding:INotifyPropertyChanged每当修改属性的值时,每个Dependency属性都会调用,DataBinding内部支持.要了解更多信息INotifyPropertyChanged,请阅读.
  7. CallBacks:您可以对依赖项属性进行回调,这样每当更改属性时,都会引发回调.
  8. 资源: Dependency属性可以获取资源.因此,在XAML中,您可以为Dependency属性的定义定义Resource.
  9. 元数据覆盖:您可以使用PropertyMetaData定义依赖项属性的某些行为.因此,从派生属性覆盖元数据将不需要您重新定义或重新实现整个属性定义.
  10. 设计器支持:依赖项属性获得Visual Studio Designer的支持.您可以在Designer的"属性"窗口中看到列出的控件的所有依赖项属性.

在这些中,某些功能仅由Dependency Property支持.Animation,Styles,Templates,属性值继承等只能使用依赖属性参加.如果在这种情况下使用CLR属性,编译器将生成错误.

请仔细阅读这些文章,

http://www.codeproject.com/KB/WPF/BeginWPF4.aspx#diff

和 http://www.dotnetfunda.com/articles/article961-wpf-tutorial--dependency-property-.aspx

和 http://msdn.microsoft.com/en-us/library/cc221408(VS.95).aspx


Sim*_*ons 8

Dependency属性是一个属性(不是本身,但依赖于另一个属性,比如XAML Binding属性),它注册另一个属性.

dependecy属性通过注册来注册后面代码中的另一个绑定属性.我的项目中使用的示例如下:

public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(CustomImagePlaceHolder), new PropertyMetadata(null));
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,ImageUri是一个依赖属性,它注册Source,在generic.xaml中定义/声明(无论是否已声明,已定义或其他任何内容),如下所示:

..HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
/>
Run Code Online (Sandbox Code Playgroud)

所以这里非常重要的是,XAML中的模板绑定值应该在后面的代码中注册为依赖属性.

因此,当我们在XAML中定义Image Source应该与Source绑定模板时,我们已经注册了与DependencyProperty相同的Source.

我们必须说哪种类型的依赖属性是,在上面的例子中Source是BitmapImage的类型,所以我们定义了typeof(BitmapImage).

现在这个依赖项属性的owner/parent是我们的customControlClass CustomImagePlaceHolder,我们在注册时再次定义了它.

现在通过使用我们的属性设置depndency属性的值,如下所示:

public BitmapImage Source
        {
            get
            {

   string strURI = (string)GetValue(CustomImagePlaceHolder.ImageUri);
                return new BitmapImage(new Uri(strURI));
            }
            set
{
SetValue(CustomImagePlaceHolder.ImageUri, value);
 }

        }
Run Code Online (Sandbox Code Playgroud)

现在这就是这样,我们将代码隐藏或xaml的值设置为上面定义的source属性,并且它设置依赖属性ImageUri的值,inturn设置模板绑定Source中的值,因为我们有将ImageUri注册为Source,即presennt generic.xaml.