資料繫結是 XAML 應用開發的核心技術,實現 UI 與資料模型的自動同步。本文系統介紹 Windows 8 中的繫結模式、INotifyPropertyChanged 即時更新、元素間繫結、值轉換器與常用繫結控制項。
<TextBox Text="{Binding LastName, Mode=TwoWay}" />
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
private void LoadAccount()
{
this.DataContext = new Person
{
FirstName = "Kevin",
LastName = "Fan",
Email = "qq34506@hotmail.com"
};
}
| 模式 | 行為 | 適用場景 | 預設值 |
|---|---|---|---|
| OneTime | 僅初始化時繫結一次,後續資料變更不更新 UI | 靜態資料、初始設定值 | 否 |
| OneWay | 資料源 → UI 單向更新 | 唯讀顯示、清單項目 | 是 |
| TwoWay | 雙向同步:資料源 ↔ UI | 表單輸入、編輯介面 | 否 |
當資料模型屬性變更時自動通知 UI 更新:
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class Person : INotifyPropertyChanged
{
public string FirstName { get; set; }
private string _lastname;
public string LastName
{
get { return _lastname; }
set
{
_lastname = value;
RaisePropertyChanged();
}
}
public string Email { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged([CallerMemberName] string caller = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
}
測試程式碼:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
person.LastName = "范"; // UI 會自動更新
}
控制項屬性直接繫結至另一個控制項:
<ProgressRing x:Name="ProgressRing1"
IsActive="{Binding IsChecked, ElementName=chkRun}" />
<CheckBox Name="chkRun" Content="執行?" />
勾選 CheckBox 時,ProgressRing 立即啟動/停止動畫。
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (Visibility)value == Visibility.Visible;
}
}
使用方式:
<Page.Resources>
<local:BoolToVisibilityConverter x:Key="BoolToVis" />
</Page.Resources>
<TextBlock Visibility="{Binding IsAdmin, Converter={StaticResource BoolToVis}}" />
<ComboBox x:Name="cbUserList"
DisplayMemberPath="FullName"
SelectionChanged="cbUserList_SelectionChanged_1" />
public List Users { get; set; }
private void LoadUsers()
{
Users = new List
{
new Person { FirstName = "Kevin", LastName = "Fan", Email = "qq34506@hotmail.com" },
new Person { FirstName = "中國", LastName = "銀光", Email = "Admin@silverlightchina.net" }
};
cbUserList.ItemsSource = Users;
}
private void cbUserList_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
SelectionGrid.DataContext = e.AddedItems[0] as Person;
}
<ListBox x:Name="lbUserList"
ItemsSource="{Binding Users}"
DisplayMemberPath="FullName"
SelectionChanged="lbUserList_SelectionChanged_1" />
Win8DataBinding.zip - 包含所有示範專案
作者:cnblogs Kevin Fan