參考資料:
Microsoft Visual C# 2013 Step by Step
http://transbot.blog.163.com/
《四步法完成C#數據綁定》
涉及三個文件:
增加一個類庫文件(.cs文件);這里規定數據倉庫、聲明類並定義屬性
UI文件(.xaml文件);這里完成屬性路徑綁定及單/雙向方式
UI架構器文件(.xaml.cs文件);這里完成界面路徑綁定。
第1步:添加類庫文件,聲明類並定義屬性
在解決方案資源管理器中右鍵項目-->添加類,為項目增加一個作為“綁定源”的數據的類。名字為MyData.cs。MyData由自己定義。這其實就是界面的后台數據倉庫。一個界面可以建一個類,一個界面上不同的控件可以建不同的類,多個界面也可以使用一個類。在綁定時選擇綁定那一個類。
然后在類庫文件中聲明類並定義屬性。對於TextBox控件,希望輸入值改變后數據倉庫同時變化,要加一些語句。代碼如下:
MyData.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StudyDisplay { // 第一步:聲明一個類,准備必要的屬性 public class DataLib : INotifyPropertyChanged //注:聲明的類, { public int _customerID; //第1個 屬性(開始) public int CustomerID { get { return this._customerID; } set { this._customerID = value; } } //第1個 屬性(結束)
public string _sampleCircle; //第2個 屬性(開始)
public string SampleCircle
{
get { return this._sampleCircle; }
set { this._sampleCircle = value; }
} //第2個 屬性(結束)
}
}
代碼中的粗體語句是因應“內容改變時后台數據同步改變”而添加。編程時,在自動生成的代碼中沒有“using System.ComponentModel;”,“ public class DataLib : INotifyPropertyChanged”的粗體部分會提示有誤,鼠標移至“INotifyPropertyChanged”右鍵-->解析-->添加using System.ComponentModel。
“namespace StudyDisplay”自動使用項目名稱空間
注意屬性里的命名方法,
_customerID
CustomerID
“value”是數據綁定的路徑。
“this.”是界面的路徑。
第2步:在類中實現INotifyPropertyChanged接口
在數據類文件中完成“雙向”的功能。在定義的類中,最后一個屬性下面添加粗體代碼:
public string _sampleCircle;
public string SampleCircle { get { return this._sampleCircle; } set { this._sampleCircle = value; } } // 第二步:完成“具有雙向的功能” public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
這是一個方法,里面沒有用戶要編的代碼。OnPropertyChanged方法引發PropertyChanged事件。
PropertyChanged 事件的PropertyChangedEventArgs參數指定了發生改變的屬性的名稱。該值作為參數傳給OnPropertyChanged方法。
第1步中的粗體部分和以上粗體代碼,稱為:在類中實現INotifyPropertyChanged接口
同時,修改Customer類的所有屬性的set訪問器,指定在值被修改時都調用OnPropertyChanged方法。如加粗的部分所示。每個屬性都得添加。
public string _sampleCircle; public string SampleCircle { get { return this._sampleCircle; } set { this._sampleCircle = value; this.OnPropertyChanged("SampleCircle"); } }
第3步:屬性路徑綁定。
在xaml文件即界面視圖文件中綁定
代碼如下:
<!--2--> <StackPanel Grid.Row="1" Grid.Column="2" Style="{StaticResource TheStackPanelStyle}" > <StackPanel> <Label Style="{StaticResource TheLabeltyle}">采樣周期</Label> <TextBox Style="{StaticResource TheTextBoxStyle}" Name="inputSC" Text="{Binding SampleCircle,Mode=TwoWay}" /> </StackPanel> <StackPanel> <Label Style="{StaticResource TheLabeltyle}">公制/英制</Label> <ComboBox Style="{StaticResource TheComboBoxStyle}" Background="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}"> <ComboBoxItem Style="{StaticResource ThComboBoxItemStyle}">公制</ComboBoxItem> <ComboBoxItem Style="{StaticResource ThComboBoxItemStyle}">英制</ComboBoxItem> <ComboBoxItem Style="{StaticResource ThComboBoxItemStyle}">華制</ComboBoxItem> </ComboBox> </StackPanel> <StackPanel> <Label Style="{StaticResource TheLabeltyle}">采樣周期1</Label> <TextBox Style="{StaticResource TheTextBoxStyle}" Name="outputSC" Text="{Binding SampleCircle,Mode=TwoWay}" /> </StackPanel>
,Mode=TwoWay可以省略。這個指明是單向還是雙向。Mode有四種方式:
OneWay單向:窗口變化則數據變化,數據變化時窗口不會變化。
TwoWay雙向:窗口變化則數據變化,數據變化時窗口也變化。
另外兩種參看參考資料。
第4步:架構路徑綁定。
在界面的代碼隱藏中進行"界面路徑綁定"。綁定完成!
在.xaml.cs文件(MainWindow.xaml.cs)中的MainWindow構造器中添加以下粗體代碼:
public MainWindow() { InitializeComponent(); DataLib dataLib = new DataLib { SampleCircle = "John"
CustomerID = 8
};
this.DataContext = dataLib;
}
SampleCircle = "John"為初始化賦值。(“CustomerID = 8”僅表示怎樣書寫一系列的初始化賦值,即都寫在這里。)
this.DataContext = customer;該語句指定 MainWindow窗體上的控件 要綁定到哪個對象。窗體上每個控件的 XAML 標記 Text="{ Binding 路徑 }" 都針對該象進行解析。例如, id TextBox和 cId TextBox 控件都指定了 Text="{Binding CustomerID},所以都顯示窗體綁定到的那個對象的 CustomerID 屬性的值。本例設置的是窗體的DataContext屬性,造成窗體上的所有控件都自動應用同一個數據綁定。也可設置單獨控件的DataContext屬性,將不同控件綁定到不同對象。