原文: http://www.cnblogs.com/pasoraku/archive/2012/10/20/2732427.html
一、binding的一般步骤 1,准备数据源 数据源需要实现INotifyPropertyChanged接口 例如:
class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string name;
public string Name
{
get { return name; }
set
{
name = value;
//触发事件
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}
}
2,准备Binding对象
Person p = new Person("D-boy");
Binding binding = new Binding();
binding.Source = p;
binding.Path = new PropertyPath("Name");
3,用Binding对象将数据源和目标连结 假如在XAML处添加了一个TextBlock目标
<TextBlock x:Name="txtName"></TextBlock>
那么可以使用BindingOperations.SetBinding()方法将其进行binding了。
BindingOperations.SetBinding(txtName, TextBlock.TextProperty, binding);
也可以使用UI元素的基类FramworkElement封装的SetBinding函数
txtName.SetBinding(TextBlock.TextProperty, binding);
将上面两步结合在一起可以这样写
txtName.SetBinding(TextBlock.TextProperty, new Binding("Name") { Source=p});
二、控件间的Binding XAML处如下两个控件
<TextBox x:Name="txt1" />
<TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />
如果要改变Binding源的触发事件,可以设置Binding的UpdateSourceTrigger属性为LostFocus、Explicit、PropertyChanged中的一种。
三、Binding的Path 1,Path的设置 如上例, XAML处为
<TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />
或是
<TextBlock x:Name="txt2" Text="{Binding Text, ElementName=txt1}" />
相应的C#代码为
txt2.SetBinding(TextBlock.TextProperty, new Binding(){ Path=new PropertyPath("Value"),Source=txt1});
或是
txt2.SetBinding(TextBlock.TextProperty, new Binding("Text") { Source=txt1});
之类的... 2,Path还支持一路点下去~~ 比如
<TextBlock x:Name="txt2" Text="{Binding Text.Length, ElementName=txt1}" />
<TextBlock x:Name="txt2" Text="{Binding Text.[2], ElementName=txt1}" />
3,当数据源本身就是数据的时候,Path为. window添加命名空间
xmlns:sys="clr-namespace:System;assembly=mscorlib"
添加资源
<Window.Resources>
<sys:String x:Key="string">
string!!!!!
</sys:String>
</Window.Resources>
使用Binding
<TextBlock x:Name="txt2" Text="{Binding ., Source={StaticResource ResourceKey=string}}" />
精简为
<TextBlock x:Name="txt2" Text="{Binding Source={StaticResource ResourceKey=string}}" />
当然这样的情况,我就直接
<TextBlock x:Name="txt2" Text="{StaticResource ResourceKey=string}" />