1.Binding的基础概念
将Source的数据传递给Target,或者Target的数据传递给Source
2.Binding最简单的绑定
创建一个普通的Student类,包含一个Name属性,当作Source
让这个类继承INotifyPropertyChanged接口,实现该接口,即声明
一个PropertyChangedEventHandler事件
public class Student:INotifyPropertyChanged {
private string name;
public string Name
{
get {
return name; }
set {
name = value;
if (PropertyChanged!=null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;`在这里插入代码片`
}
事件信息参数为要修改的Name属性。
然后在XAML中声明一个TextBox与Button,TextBox作为Target,Button修改Source的Name。
可以在C#中做绑定
```csharp
this.text1.SetBinding(TextBox.TextProperty,new Binding("Name") {
Source=stu});
也可以在XAML中做绑定,XAML语言是不能直接访问对象的,只能通过ElementName=sourceName,即通过设置ElementName,对象名字来访问对象
<TextBox x:Name="text1" Margin="5" Text="{Binding Path=Value,ElementName=slider1}"/>
<Slider x:Name="slider1" Margin="5" Maximum="100" Minimum="0" />
XAML中进行绑定最好是简单的绑定,只有Source Path 这种是比较合适的,当涉及到数据校验或者数据转换的时候,需要在C#的代码中实现较为合适。
可以看出的是XAML中进行Binding的方式是对某一属性使用扩展方法进行赋值,赋值的内容为"{Binding Path= , ElementName =,…}"
3.没有Path的绑定
Source本身就是一个值的时候,即Source为Path的时候可以省略掉Path
<StackPanel.Resources>
<sys:String x:Key="myString">
菩提本无树,明镜亦非台。
本来无一物,何处惹尘埃。
</sys:String>
</StackPanel.Resources>
<TextBlock x:Name="textBlock1" TextWrapping="Wrap"
Text="{Binding Source={StaticResource ResourceKey=myString}}" FontSize="16"
Margin="5"/>
</StackPanel>
对应的C#绑定代码为
string mystring = “菩提本无树,明镜亦非台。本来无一物,何处惹尘埃。”;
this.textBlock1.SetBinding(TextBlock.TextProperty, new Binding(".") { Source = mystring });
4.作为Source的情况,当Source指定好之后,Path就可以比较简单的确认了,无论是Source本身还是其中的某一属性。
(1)普通的类(注意要实现INotifyPropertyChanged接口来通知binding数据更新),或者普通的控件都可以作为Source
(2)DataContext:所有的控件都有这个属性,当没有给这个属性赋值的时候,会根据UI树向上寻找有赋该值的控件,然后借用其值(依赖属性的定义)
先声明一个学生类
public class Student {
public string Name {
get; set; }
public int Id {
get; set; }
public int Age {
get; set; }
}
注意不要声明字段,在XAML中为DatatContext中设置的时候读取不到字段。
XAML中设置TextBox与Student中类的属性进行绑定
<StackPanel Background="LightBlue">
<StackPanel.DataContext>
<local:Student Name="Tim" Age="28" Id="6"/>
</StackPanel.DataContext>
<Grid>
<StackPanel>
<TextBox Text="{Binding Path=Name}" Margin="5"/>
<TextBox Text="{Binding Path=Id}" Margin="5"/>
<TextBox Text="{Binding Path=Age}" Margin="5"