依赖属性的创建方式与属性相同。
是否仅在创建自定义控件时使用依赖项属性?
答案 0 :(得分:56)
依赖属性和标准属性完全不同。
依赖项属性提供的主要功能是对绑定和动画的支持。如果要使用Binding
或模板绑定为属性分配值,则该属性需要是依赖项属性。在为属性设置动画时,依赖项属性可以跟踪当前指定的值和当前的动画值。
经常被忽视的另一个优点是只有分配了值的属性才需要存储。典型的控件可以具有很多属性,但是它的罕见代码为所有属性分配了一个新值,实际上,大多数属性都保留了默认值,实际设置的只有少数。使用依赖项属性时,默认值将存储为与属性相关的元数据,如果属性保持未分配状态,则不需要为每个控件实例分配任何内存。
依赖属性不仅限于控件(从DependencyObject
派生的任何东西都可以拥有它们)但是它在控件上或至少FrameworkElements
它们最有用。
答案 1 :(得分:22)
依赖属性的优点
事实上,依赖属性比普通的CLR属性有很多优点。
INotifyPropertyChanged
,内部支持DataBinding
。要了解有关INotifyPropertyChanged
的更多信息,请阅读。 在这些中,某些功能仅由Dependency Property支持。 Animation
,Styles
,Templates
,属性值继承等只能使用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
希望这有帮助。