1. 程式人生 > >說說WPF的依賴屬性

說說WPF的依賴屬性

eof ML binding The pro 運行程序 nta sent 什麽是

首先,我們先來大概了解一下依賴屬性

什麽是依賴屬性:依賴屬性自己沒有值,通過依賴別人(如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的依賴屬性