财产和依赖财产有什么区别?
依赖属性的创build方式与属性相同。
是仅在创build自定义控件时使用的依赖属性?
依赖属性是一个属性(不是本身,但依赖于另一个,比方说一个XAML绑定属性)注册另一个属性。
依赖属性通过注册后面的代码注册其他绑定属性。 我的项目中使用的示例如下所示:
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中定义图像源应该是与源模板绑定的时候,我们已经注册了相同的源作为依赖属性。
我们必须说哪种types的依赖属性是在上面的例子中Source是BitmapImage的types,所以我们定义了typeof(BitmapImage)。
现在这个依赖属性的所有者/父母是我们的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属性,并且inturn设置依赖属性ImageUri的值,它将inturn设置模板绑定Source中的值,就像我们注册ImageUri作为源,这是先验generic.xaml。
依赖属性和标准属性是完全不同的。
依赖属性提供的关键function是支持绑定和animation 。 如果要使用Binding
或模板绑定将属性值指定给属性,则该属性需要成为依赖项属性。 animation属性时,依赖项属性可以跟踪当前分配的值和当前的animation值。
另一个经常被忽视的优点是只有具有赋值的属性才需要存储。 一个典型的控件可以有很多的属性,但是它罕见的代码为所有的属性分配一个新的值,事实上,大部分的属性都保留默认值,而实际上只有很less的属性被设置。 使用依赖项属性时,默认值将作为与属性相关的元数据进行存储,如果属性保持未分配状态,则不需要为每个控件实例分配任何内存。
依赖属性并不局限于控件(从DependencyObject
派生的任何东西都可以),但是它在控件或者至less是最有用的FrameworkElements
上。
依赖属性的优点
事实上,依赖性属性比正常的CLR属性有很多优点。
- 属性值inheritance:通过属性值inheritance我们表示可以在层次结构中重写依赖属性的值,以便最终设置具有最高优先级的值。
- 数据validation:我们可以强制数据validation在属性值被修改时自动触发。
- 参与animation:依赖属性可以animation。 WPFanimation具有很多能够以一定间隔更改值的function。 定义一个依赖属性,你最终可以支持该属性的animation。
- 参与样式:样式是定义控件的元素。 我们可以在依赖属性上使用样式设置器。
- 参与模板:模板是定义元素整体结构的元素。 通过定义依赖属性,我们可以在模板中使用它。
- DataBinding:每当属性的值被修改时,每个Dependency属性本身都会调用
INotifyPropertyChanged
,因此内部支持DataBinding
。 要阅读更多关于INotifyPropertyChanged
,请阅读。 - CallBacks:你可以callback一个依赖项属性,这样每当一个属性被改变时,就会引发一个callback。
- 资源:依赖项属性可以占用一个资源。 因此,在XAML中,您可以为Dependency属性的定义定义一个资源。
- 元数据覆盖:您可以使用PropertyMetaData来定义依赖项属性的某些行为。 因此,覆盖元数据forms的派生属性不会要求您重新定义或重新实现整个属性定义。
- Designer支持:依赖项属性从Visual Studio Designer获得支持。 您可以看到devise器属性窗口中列出的控件的所有依赖项属性。
在这些中,一些function仅由依赖属性支持。 Animation
, Styles
, Templates
,属性值inheritance等只能使用依赖属性参与。 如果你在这种情况下使用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
如果在VS编辑器中inputpropdp并敲击制表符,那么依赖属性的自动生成文档设置为:
//使用DependencyProperty作为MyProperty的后备存储。
这使animation,造型,绑定等…
依赖属性和标准clr属性之间的主要区别是依赖属性可以是绑定的目标。 这使您可以将该属性的值与某个其他对象提供的值绑定。
我build议如果你正在做一个自定义的控件或标记扩展,你通常希望公开它的任何公有属性作为依赖属性,这样你的控件的使用者可以更好地操作XAML中的设置(而不必在代码中完成) -背后)。
如果你的财产将通常是数据绑定的来源(例如提供TextBlock的文本),我会build议使用标准的CLR属性,并使包含类实现INotifyPropertyChanged。
进一步….
依赖项属性提供的function扩展了属性的function,而不是由字段支持的属性。 通常,每个这样的function都表示或支持整个WPFfunction集的特定function。
资源
数据绑定
样式
animation
元数据覆盖
属性值inheritance
http://msdn2.microsoft.com/en-us/library/ms752914.aspx
希望这可以帮助。