綁定與通知屬性到界面
本文同時為b站WPF課程的筆記,相關示例代碼
前言
在上一篇文章C#代碼事件里面,我們介紹了利用給控件命名的方式,在后端代碼中訪問并修改屬性。這樣子直截了當,但是這樣后端代碼依賴于前端。如果前端的代碼變動較大,后端代碼可能要大面積重構。
于是利用綁定的這種方法,將前后端分離,前端只需把需要修改的屬性設置好綁定變量名,后端只需盯著這些變量名進行操作。
這樣還可以實現前后端雙人開發(fā),后端開發(fā)者只需把那些操作的接口名稱告訴前端,讓對方去綁定相應的空間屬性即可。
綁定
控件屬性設置為"{Binding xxxx}"
例如綁定文本框的文字內容到UserName
:
<TextBox Text="{Binding UserName}" Grid.Row="0" Grid.Column="1" Margin="2"/>
在后端中寫入:
public string UserName { get; set; }
接下來就可以在后端的代碼中直接使用變量UserName
。
其中get;
與set;
是自動生成了屬性的訪問器,分別用于獲取屬性的值與修改屬性的值。這是自動實現的屬性,不需要手寫。
可以輸入
prop
然后按 Tab 鍵兩次,一鍵生成public int MyProperty { get; set; }
屬性的代碼模板,加快了編寫常見代碼結構的速度。
屬性的初值
假如想要程序剛運行的時候,文本框里就已經有文字,可以給綁定的變量賦值:
public string UserName { get; set; } = "333"
但是運行會發(fā)現,并沒有預期的效果。
可以在窗口的構造函數public MainWindow()
中,初始化窗口InitializeComponent();
之后,將窗口的 DataContext
設置為窗口本身的實例:
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
在上面的例子中,UserName
是 MainWindow
的一個屬性。通過將 DataContext
設置為 this
(即 MainWindow
的當前實例),告訴了數據綁定引擎應該在當前的 MainWindow
實例中查找 UserName
屬性。
這樣,在 XAML 中使用 {Binding UserName}
的時候,它能正確地找到 MainWindow
的 UserName
屬性,并將其與 UI 元素關聯起來。
自動更新界面
接下來的后端代碼中,即使對于變量UserName
做出了修改,前臺的界面也不會實時的發(fā)生變化。
為了使 WPF 的數據綁定能夠響應屬性值的變化,并自動更新界面,需要實現
INotifyPropertyChanged
接口。這個接口用于通知數據綁定引擎某個屬性的值已經改變,從而引擎可以更新綁定到該屬性的 UI 元素。
以下詳細說明:
實現INotifyPropertyChanged接口
在這個類(上面的例子中是``MainWindow)中實現
INotifyPropertyChanged接口,需要聲明一個
PropertyChanged` 事件:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
定義 RaisePropertyChanged 函數:
private void RaisePropertyChanged(string propertyChanged)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyChanged));
}
- 這個函數用于觸發(fā)
PropertyChanged
事件。 - 當某個屬性的值被改變時,我們只需要調用這個方法,傳遞屬性的名字作為參數,這樣界面就會發(fā)生更新。
修改屬性以觸發(fā) PropertyChanged 事件
private string _UserName = "333";
public string UserName
{
get { return _UserName; }
set
{
if (_UserName != value)
{
_UserName = value;
RaisePropertyChanged(nameof(UserName));
}
}
}
- 對于需要綁定的每個屬性,我們就不再使用原本自動實現的屬性(原本的是自動生成的,只需要寫
{ get; set; }
就行。 - 而是,首先需要給每個屬性創(chuàng)建一個私有字段(在這個案例中就叫
_UserName
)。 - 在屬性的
set
訪問器中,我們設置字段的值,并且調用RaisePropertyChanged
方法,可以達到一旦變量改變,就更新界面的效果。
可以輸入
propfull
然后按 Tab 鍵兩次,一鍵生成以下代碼模板:private int myVar; public int MyProperty { get { return myVar; } set { myVar = value; } }
然后可以根據需要修改類型(
int
)、字段名(myVar
)和屬性名(MyProperty
)。對于上面的INotifyPropertyChanged
的情況,還需要在set
訪問器中添加屬性值變化通知的代碼。
總結
綁定
例如綁定文本框的文字內容到UserName
:
<TextBox Text="{Binding UserName}"/>
在后端中寫入:
public string UserName { get; set; }
可以輸入prop
使用代碼模板。
初值
直接賦值
public string UserName { get; set; }
但是注意將窗口的 DataContext
設置為窗口本身的實例
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
實時更新
聲明 PropertyChanged
事件:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
定義 RaisePropertyChanged
函數:文章來源:http://www.zghlxwxcb.cn/news/detail-822405.html
private void RaisePropertyChanged(string propertyChanged)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyChanged));
}
修改屬性觸發(fā)更新事件
private string _UserName = "333";
public string UserName
{
get { return _UserName; }
set
{
if (_UserName != value)
{
_UserName = value;
RaisePropertyChanged(nameof(UserName));
}
}
}
可以輸入propfull
使用代碼模板。文章來源地址http://www.zghlxwxcb.cn/news/detail-822405.html
到了這里,關于WPF綁定與通知屬性到界面的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!