依赖属性附加属性
依赖属性:
之前研究的都是Binding的Source和Path,现在研究一下目标Target,依赖属性。
C#语言规定:对类有意义的字段和方法,使用static关键字修饰为静态成员,对类的实例有意义的字段和方法不加static关键字。静态字段在内存中只有一个拷贝,非静态字段则是每个实例拥有一个拷贝。
属性的由来:为了保证类中字段的安全性,增加了访问和设置两个方法,后又提出来依赖属性:一种可以自己没有值,通过使用Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象称为依赖对象。
有一个例子,让我们来更深入的理解依赖属性,TextBox有138个属性,每个CLR属性都包装了一个4字节的字段,如果程序运行时创建了10列1000行的一个TextBox列表,那么这些字段将占用4*138*10*1000≈5.26MB内存,所以想了一个实际一点的办法,用得着就带上,用不着就不带,有必要的时候就借用一下别人的,这种实时获取数据的能力依靠依赖属性来实现。
WPF控件所有的UI控件都是依赖对象,绝大多数属性都已经依赖化了。
依赖属性的声明:
附加属性:
一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性,称为附加属性。
下面是附加属性的一个简单举例:
using System.Windows;public static class MyAttachedProperties
{// 1. 注册附加属性public static readonly DependencyProperty IsHighlightedProperty =DependencyProperty.RegisterAttached("IsHighlighted", // 属性名typeof(bool), // 属性类型typeof(MyAttachedProperties), // 所属类new PropertyMetadata(false) // 默认值);// 2. 提供静态的 Get 方法public static bool GetIsHighlighted(DependencyObject obj){return (bool)obj.GetValue(IsHighlightedProperty);}// 3. 提供静态的 Set 方法public static void SetIsHighlighted(DependencyObject obj, bool value){obj.SetValue(IsHighlightedProperty, value);}
}
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp"Title="MainWindow" Height="350" Width="525"><StackPanel><!-- 使用附加属性 --><Button Content="Click Me" local:MyAttachedProperties.IsHighlighted="True"/></StackPanel>
</Window>
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();// 获取附加属性的值bool isHighlighted = MyAttachedProperties.GetIsHighlighted(myButton);// 设置附加属性的值MyAttachedProperties.SetIsHighlighted(myButton, true);}
}
附加属性是依赖属性的一种特殊形式,允许一个类将属性附加到其他类的实例上。通过 DependencyProperty.RegisterAttached
注册,并提供静态的 Get
和 Set
方法来访问和修改附加属性的值。附加属性在布局控制和行为扩展方面非常有用,是WPF和UWP开发中的重要工具。