依赖属性的创建方式与属性相同。
依赖属性仅在创建自定义控件时使用吗?
依赖属性和标准属性有很大的不同。
依赖属性提供的关键特性是支持“绑定”和“动画”。如果您想使用“绑定”或模板绑定为属性分配一个值,那么该属性需要是依赖属性。当对属性进行动画处理时,依赖属性可以跟踪当前分配的值和当前动画值。
另一个常被忽略的优点是仅需要为具有分配值的属性分配存储空间。 典型的控件可以有很多属性,但只有很少的属性实际上被设置了新值,并且大多数属性都保留在其默认值。 使用依赖属性,缺省值会存储为与属性相关的元数据,如果属性保持未分配状态,则不需要每个控件实例分配任何内存。
依赖属性不限于控件(任何派生自DependencyObject
的内容都可以拥有它们),但是对于控件或至少FrameworkElements
来说,它们最为有用。
依赖属性的优点
实际上,相较于普通CLR属性,依赖属性拥有许多优势。
INotifyPropertyChanged
,因此内部支持DataBinding
。要了解更多关于INotifyPropertyChanged
的内容,请阅读相关文档。动画
、样式
、模板
和属性值继承等只能使用依赖属性来实现。如果在这些情况下使用CLR属性,编译器将会生成错误。依赖属性是一种属性(不是本身,而是依赖于另一个属性,可以是XAML绑定属性),它会注册另一个属性。
依赖属性通过注册来在代码后台注册其他绑定属性。我的项目中使用的一个示例如下:
public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(CustomImagePlaceHolder), new PropertyMetadata(null));
..HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
/>
public BitmapImage Source
{
get
{
string strURI = (string)GetValue(CustomImagePlaceHolder.ImageUri);
return new BitmapImage(new Uri(strURI));
}
set
{
SetValue(CustomImagePlaceHolder.ImageUri, value);
}
}
//使用DependencyProperty作为MyProperty的后备存储。
这使动画、样式、绑定等成为可能...