WPF中的依賴項屬性
WPF的工程是由XAML文件和C#文件溝通構成的。C#在工程中主要用於處理邏輯,而XAML則用來在軟件界面上顯示。很多情況下我們都希望后台的屬性改變之后能夠在前台的界面上也呈現出來這種變化。常見的這種通知變化的方式有兩種,分別是:
1. 使用PropertyChangedEventHandler在屬性改變的時候通知用戶界面。
2. 使用依賴項屬性。
例子:
XAML文件:
<TextBox Text="{Binding Path=StudentAge}" Grid.Row="3" Grid.Column="2" VerticalAlignment="Top" Margin="0,5,0,0" />
說明:在這個文件中放置了一個TextBox,該元素的Text屬性與數據模型中的屬性StudentAge
綁定。
C#文件:
int _studentAge; public int StudentAge { get { return _studentAge; } set { _studentAge = value; } }
說明:在C#文件中雖然定義了StudentAge屬性,並完成了與XAML的綁定,但是現在屬性值改變的時候UI界面上不會發生改變。這就需要前面提到的兩種處理方式去實現后台數據與前台UI之間的同步變化。
方式一:使用PropertyChangedEventHandler在屬性改變的時候通知用戶界面。
#region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } int _studentAge; public int StudentAge { get { return _studentAge; } set { _studentAge = value; OnPropertyChanged("StudentAge"); //這句代碼很重要,用其通知前台界面//去改變 } }
說明:首先申明一個PropertyChangedEventHandler事件,並實現OnPropertyChanged函數。用於觸發事件,並通知用戶界面改變。
小結:通過以上的方法就能夠實現后台數據改變並在前台界面上顯示的效果。這是一種方法。還有一種方法就是下面將要說明的依賴項屬性。
方法二:依賴項屬性
public static readonly DependencyProperty StudentAgeProperty = DependencyProperty.Register("StudentAge", typeof (int), typeof (StudentData)); public int StudentAge { get { return (int)GetValue(StudentAgeProperty); } set { SetValue(StudentAgeProperty, value); } }
說明:依賴項屬性使用的時候只需要先創建一個依賴項的實例。如上面的StudentAgeProperty。創建的時候調用Register注冊。注冊函數的參數包含了屬性名。然后按照上面的方式聲明屬性就可以了。
總結:在自定義類中一般都比較少使用依賴項屬性,使用的時候用前面的第一種方式解決就可以了(使用依賴項屬性的時候會出現錯誤,因為GetValue和SetValue函數都是來自於Control類的,自定義類繼承於這個類才能使用這兩個方法)。但是對於要擴展一個控件的屬性的時候依賴項屬性就比較有用了!