說說WPF的依賴屬性
首先,我們先來大概了解一下依賴屬性
什麽是依賴屬性:依賴屬性自己沒有值,通過依賴別人(如Binding)來獲得值。
依賴屬性為什麽會出現:控件常用字段有限,包裝太多屬性會占用過高內存,造成浪費。所以用依賴屬性,用不著就不用,用得著就用。
怎麽聲明依賴屬性:用public static readonly三個修飾符修飾。
怎麽聲明實例:使用DependencyProperty.Register方法生成。此方法有三個參數跟四個參數。
怎麽操作依賴屬性的值:利用依賴對象(Dependency Object)的GetValue、SetValue方法實現。
現在,我們用代碼來實現一下依賴屬性:
XAML
<Window x:Class="DependecyProperty.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DependecyProperty" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <StackPanel> <TextBox /> <TextBox x:Name="testTB"/> </StackPanel> </Window>
聲明依賴屬性與引用
public class Student : DependencyObject { /// <summary> /// 聲明依賴屬性 /// </summary> // Using a DependencyProperty as the backing store for NameProperty. This enables animation, styling, binding, etc... public static readonly DependencyProperty NamePropertyProperty = DependencyProperty.Register("NameProperty", typeof(string), typeof(Student)); }引用
public MainWindow()
{
InitializeComponent();
//實例化類
Student stu = new Student();
//給依賴屬性賦值
stu.SetValue(Student.NamePropertyProperty,"dfsdfsd");
//獲取依賴屬性的值
testTB.Text = stu.GetValue(Student.NamePropertyProperty).ToString();
}
運行程序則成功獲取依賴屬性的值。但不能直接在xaml中得到依賴屬性的值?我們可以綁定依賴屬性到文本框上
<Window x:Class="DependecyProperty.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DependecyProperty" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <StackPanel> <TextBox /> <!--當依賴屬性改變時,文本框的字符也得到通知,實時改變 --> <TextBox x:Name="testTB" Text="{Binding NameProperty,Mode=TwoWay}"/> </StackPanel> </Window>
在後置代碼處綁定數據
//實例化類 Student stu = new Student(); this.DataContext = stu;
則成功獲取依賴屬性
可能到此處就有人問了,聲明依賴屬性打這麽多字很麻煩,有沒有方便的方法?可以通過打propdp然後按兩次tab鍵,visual studio會自動生成依賴屬性,自動生成的依賴屬性的DependencyProperty.Register
(可能有觀察力強的人問,新增依賴屬性會產生這麽多錯誤嗎?因為途中有多個錯誤信息。其實這些錯誤是我在命名空間中聲明依賴屬性導致的,這是個錯誤的示範,無視即可)
依賴屬性應用於什麽場景?
依賴屬性可用於場景不斷變化的場景,比如一個按鈕的文字在不同情況下變化。這種情況我們可以繼承接口INotifyPropertyChanged,然後聲明屬性的變化通知。不過相對依賴屬性來說,它的性能成本高,所以這樣的情況就可以使用依賴屬性。其它類需要使用此依賴屬性的時候 ,也可以借用。一般依賴屬性的應用場景是自定義控件。
說說WPF的依賴屬性