第4篇 四步法C#数据绑定
参考资料:
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属性,将不同控件绑定到不同对象。