通過Demo學WPF—數據綁定(一)?
前言?
想學習WPF,但是看視頻教程覺得太耗時間,直接看文檔又覺得似懂非懂,因此想通過看Demo代碼+文檔的方式進行學習。
準備?
微軟官方其實提供了WPF的一些Demo,地址為:microsoft/WPF-Samples: Repository for WPF related samples (github.com)
將其克隆到本地,有很多的Demo代碼:

新建一個空白解決方案:

添加現有項目:

選擇Data Binding 中的 SimpleBinding:

項目文件如下所示:

查看SimpleBinding這個Demo的效果:

學習這個Demo?
數據綁定的概念
首先需要知道數據綁定的基本概念,數據綁定是在應用 UI 與其顯示的數據之間建立連接的過程。 如果綁定具有正確的設置,并且數據提供適當的通知,則在數據更改其值時,綁定到該數據的元素會自動反映更改。 數據綁定還意味著,如果元素中數據的外部表示形式發生更改,則基礎數據可以自動進行更新以反映更改。 例如,如果用戶編輯 TextBox 元素中的值,則基礎數據值會自動更新以反映該更改。
現在再來看一下,數據綁定的模型圖:

現在我們根據這張模型圖,學習這個Demo。
這個模型圖表示數據綁定至少需要三個東西:
- 綁定目標
- 綁定
- 綁定源
現在我們分別看看這個demo里面,這三個東西在哪?
綁定目標
我們發現這個demo的綁定目標是元素TextBox的Text屬性與TextBlock的Text屬性。
綁定

這是一個C#類,查找在該Demo中,哪里出現了Binding?
發現在MainWindow.xaml中出現了Binding,有兩處地方,分別是:
<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource MyDataSource}" Path="PersonName"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
與
<TextBlock Text="{Binding Source={StaticResource MyDataSource}, Path=PersonName}"/>
這兩處都是在 XAML 中聲明綁定。
<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource MyDataSource}" Path="PersonName"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
這種使用的是對象元素語法。
<TextBlock Text="{Binding Source={StaticResource MyDataSource}, Path=PersonName}"/>
這種使用的是標記擴展。
從這里我們接觸到了Binding類的三個屬性,Source、Path與UpdateSourceTrigger。
那它們分別是什么意思呢?
先來看下Source:

我們發現這個demo里,Source="{StaticResource MyDataSource},StaticResource MyDataSource又是什么呢?
在Window.Resources標簽下有一行代碼:

<local:Person x:Key="MyDataSource" PersonName="Joe"/>
<Window.Resources>標簽在XAML中用于定義可以在整個窗口中重用的資源。這些資源可以是各種類型,包括樣式、數據源、數據模板、顏色、畫刷等。
<local:Person x:Key="MyDataSource" PersonName="Joe"/>這行代碼創建了一個Person對象,并將其命名為"MyDataSource",該對象的PersonName屬性設置為"Joe",這樣你就可以在窗口的其他地方通過這個鍵來引用這個對象。
因此Source={StaticResource MyDataSource}的意思就是將Binding對象的Source屬性設置為鍵為"MyDataSource"的資源,在這里也就是一個Person對象。
再來看看Path:

表示綁定源屬性的路徑。
Path="PersonName"表示綁定源是剛剛那個Person對象的PersonName屬性。
最后再看看UpdateSourceTrigger:

這個屬性可能就會難理解一點。
它表示當綁定目標怎么樣時,綁定源的值應該被更新。
它的類型為枚舉類型,有以下幾個值:
| 值 | 含義 |
|---|---|
| Default | 綁定目標屬性的默認 UpdateSourceTrigger 值。 大多數依賴屬性的默認值為 PropertyChanged,而 Text 屬性的默認值為 LostFocus。 |
| Explicit | 僅在調用 UpdateSource() 方法時更新綁定源。 |
| LostFocus | 每當綁定目標元素失去焦點時,都會更新綁定源。 |
| PropertyChanged | 每當綁定目標屬性發生更改時,都會更新綁定源。 |
<Label>Enter a Name:</Label>
<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource MyDataSource}" Path="PersonName"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
我們會發現在這個demo中,TextBox.Text設置了UpdateSourceTrigger屬性。
這是因為大多數依賴項屬性的默認值為 PropertyChanged,而 Text 屬性的默認值為 LostFocus。在這個demo中,我們不希望失去焦點才更新源數據,而是一發生改變就更新綁定源,因此設置UpdateSourceTrigger屬性為PropertyChanged。
總結一下,我們遇到的關于Binding類的三個屬性Source、Path與UpdateSourceTrigger:
| 屬性名 | 含義 |
|---|---|
| Source | 獲取或設置要用作綁定源的對象。 |
| Path | 獲取或設置綁定源屬性的路徑。 |
| UpdateSourceTrigger | 獲取或設置一個值,它可確定綁定源更新的時機。 |
現在我們已經介紹了綁定目標、綁定就差綁定源了。
綁定源
在數據綁定中,綁定源對象是指用戶從其獲取數據的對象。
在這個demo中,綁定源是一個Person對象。
查看Person類的代碼:
using System.ComponentModel;
namespace SimpleBinding
{
// This class implements INotifyPropertyChanged
// to support one-way and two-way bindings
// (such that the UI element updates when the source
// has been changed dynamically)
public class Person : INotifyPropertyChanged
{
private string _name;
public Person()
{
}
public Person(string value)
{
_name = value;
}
public string PersonName
{
get { return _name; }
set
{
_name = value;
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("PersonName");
}
}
// Declare the event
public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
var handler = PropertyChanged;
handler?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}
首先這個Person類實現了INotifyPropertyChanged接口,我們來看下INotifyPropertyChanged接口:
public interface INotifyPropertyChanged
{
//
// 摘要:
// Occurs when a property value changes.
event PropertyChangedEventHandler? PropertyChanged;
}
包含一個PropertyChanged事件,因此該Person類必須實現接口的成員PropertyChanged。
當屬性值被設置時,會調用OnPropertyChanged方法,從而觸發事件。
INotifyPropertyChanged接口定義了一個PropertyChanged事件,當一個屬性的值發生變化時,你可以觸發這個事件。WPF的數據綁定引擎會監聽這個事件,當事件被觸發時,它會更新綁定的UI元素的值。
如果你的數據源沒有實現這個接口,那么當數據源的屬性值發生變化時,WPF的數據綁定引擎將無法知道這個變化,因此它將無法更新UI元素的值。
這意味著,如果你的數據源的屬性值在運行時可能會發生變化,并且你希望這些變化能夠自動反映到UI上,那么你的數據源就需要實現INotifyPropertyChanged接口。
總結?
通過這個小Demo,我們明白了WPF中的數據綁定的三要素,綁定對象、綁定、綁定源。在這個demo中,我們學會了如何在xaml中聲明綁定,知道了Binding的三個屬性Source、Path與UpdateSourceTrigger的含義,明白了數據源為什么要實現INotifyPropertyChanged接口,學會了WPF中數據綁定的基本用法,希望對你有所幫助。

浙公網安備 33010602011771號