Property和Dependency Property之间有什么区别

时间:2010-09-09 07:05:10

标签: c# wpf silverlight dependency-properties

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

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

5 个答案:

答案 0 :(得分:56)

依赖属性和标准属性完全不同。

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

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

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

答案 1 :(得分:22)

依赖属性的优点

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

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

答案 2 :(得分:7)

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

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

public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(CustomImagePlaceHolder), new PropertyMetadata(null));

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

..HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
/>

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

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

我们必须说哪种类型的依赖属性是,在上面的例子中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);
 }

        }

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

答案 3 :(得分:0)

如果您键入 propdp 并点击VS编辑器中的制表符,则自动生成的Dependency Properties文档设置为:

  

//使用DependencyProperty作为MyProperty的后备存储   这可以实现动画,样式,装订等......

答案 4 :(得分:0)

依赖项droperty和标准clr属性之间的主要区别在于依赖项属性可以是绑定的目标。这允许您将属性的值绑定到某个其他对象提供的值。

我建议如果您正在制作自定义控件或标记扩展,您通常希望将其任何公共属性公开为依赖项属性,以便控件的使用者可以更好地操作XAML中的设置(无需执行操作)它在代码隐藏中。)

如果您的属性通常是数据绑定的源(例如,为TextBlock提供Text),我建议使用标准CLR属性并使包含类实现INotifyPropertyChanged。

此外....

依赖项属性提供扩展属性功能的功能,而不是字段支持的属性。通常,每个此类功能都表示或支持整个WPF功能集的特定功能。

资源

数据绑定

样式

动画

元数据覆盖

属性值继承

http://msdn2.microsoft.com/en-us/library/ms752914.aspx

希望这有帮助。