使用其 Data Binding (資料繫結)時至少要掌握的三個關鍵處理:
- 其 Data Context 的屬性掌握。
- UI Element 的屬性所繫結到的 Data 兩者之間的 Notification 設計。
- 所繫結到的 Data 若是集合體,請把該集合體的型別設計為 ObservableCollection<T> 。
其一:
- Windows Presentation Foundation (WPF) 技術的 Data Context 屬性: DataContext。
- Xamarin.Froms/.NET MAUI 技術的 Data Context 屬性: BindingContext (Xamarin.Forms/.NET MAUI)。
- Windows App SDK with UWP/WinUI3 中使用 "{Binding}" 時,在 FrameworkElement 中的 Data Context 屬性: DataContext。
(另有 {x:bind} 來進行資料繫結的撰寫方式,以利在此開發技術中取得更好的繫結效能跟偵錯問題處理,詳見此連結介紹)
其二:
資料類別設計,除了要記得去實作 INotifyPropertyChanged 的介面外,也請記得在每個屬性的 set 區塊去呼叫變化的通知功能。
private string _phoneNumber;
public string PhoneNumber
{
get
{
return _phoneNumberValue;
}
set
{
if (value != _phoneNumberValue)
{
_phoneNumberValue = value;
}
}
}
請記得寫成
private string _phoneNumber
public string PhoneNumber
{
get
{
return _phoneNumberValue;
}
set
{
if (value != _phoneNumberValue)
{
_phoneNumberValue = value;
NotifyPropertyChanged();
}
}
}
最怕的就是所設計的類別當中,有的屬性有設計、有的屬性沒有設計,然後 UI 又去繫結到沒有設計的屬性,就…
當然,可以的話就使用 "CommunityToolkit.Mvvm" 來撰寫該類別的設計。可到 https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/ 參考使用的方式,在能妥善運用 CommuntiyToolkit.Mvvm 後就不用每次都要自己重頭實作了。
其三:
如果所設計的類別當中有要記錄多個資料,而設計了集合或陣列來紀錄資料時,請直接使用 ObservableCollection 設計。
不然在透由 Binding 繫結該資料物件的集合或陣列屬性後,UI 是不會接收到集合或陣列的內部資料有產生變化時的通知。
妙的是…
曾經看到為了讓 UI 收到資料的變化通知,還會在 C# 程式當中把 DataContext 重新設定一次的寫法,如下:
DataContext = null;
DataContext = 原本的物件;
對了,上述做法也能解決其二的困擾,但這是不正確的作法,請不要學。
I'm a Microsoft MVP - Developer Technologies (From 2015 ~).
I focus on the following topics: Xamarin Technology, Azure, Mobile DevOps, and Microsoft EM+S.
If you want to know more about them, welcome to my website:
https://jamestsai.tw
本部落格文章之圖片相關後製處理皆透過 Techsmith 公司 所贊助其授權使用之 "Snagit" 與 "Snagit Editor" 軟體製作。