下面进行介绍一个Binding的最简单用法:
我们首先创建一个Students类包含一个学生姓名的列表的属性。这个类的实例将会作为数据源.
class Students
{
private List<string> name = new List<string>();
public List<string> Name = public List<string> Name
{
get { return name; }
set { name = value;}
}
}
现在这个Students类的Name属性是普通属性,无法通知Binding,所以Binding也就无法把属性值的变化传给UI元素,下面我们在属性的Set方法中激发一个PropertyChanged事件,这个事件不需要我们实现,我们需要实现INotifyPropertyChanged接口:
class Students : INotifyPropertyChanged
{
private List<string> name = new List<string>();
public List<string> Name {
get { return name; }
set {
name = value;
if (PropertyChanged != null)
{
this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
这时当Name属性的值发生变化时PropertyCharged事件就会被激发,bingding接收到这个事件后发现事件告诉他”Name”属性的值发生变化,于是Binding就会通知目标端的UI元素显示新的值。
下面给出完整的一个小例子:
XAML:
<Grid>
<StackPanel>
<ComboBox x:Name="comboBox" Margin="5"/>
<Button Margin="5" Click="Button_Click">Add Age</Button>
</StackPanel>
</Grid>
对应的cs代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//重点在这进行binding
this.comboBox.SetBinding(ComboBox.ItemsSourceProperty, new Binding("Name") {Source = stu});
}
class Students:INotifyPropertyChanged
{
private List<string> name = new List<string>();
public List<string> Name {
get { return name; }
set {
name = value;
if (PropertyChanged != null)
{
this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
private Students stu = new Students();
List<string> names = new List<string>();
private void Button_Click(object sender, RoutedEventArgs e)
{
names.Add("Hello");
names.Add("World");
names.Add("Binding");
names.Add("\n");
stu.Name = null;
stu.Name = names;
}
}
上面有注释那句代码
this.comboBox.SetBinding(ComboBox.ItemsSourceProperty, new Binding("Name") {Source = stu});
我们进行分解(下面代码等价与上面那句):
Binding binding = new Binding();//定义bindg
binding.Source = stu;//指定实例数据源
binding.Path = new PropertyPath("Name");//指定访问路径即绑定哪一个属性。
BindingOperations.SetBinding(this.comboBox,ComboBox.ItemsSourceProperty,binding);//把数据源与目标连在一起。
结果: