数据绑定
在窗体中放置了一个Slider控件和一个TextBlock控件:
<StackPanel Margin="5" Name="stackPannel">
<Slider Name="slider1" TickPlacement="Both" Minimum="1" Maximum="40" TickFrequency="1" Margin="3" Value="10" />
<TextBlock Text="This is a test text." Name="textBlock" Margin="10" FontSize="{Binding ElementName=slider1, Path=Value}"/>
</StackPanel>
在TextBlock控件中绑定了Slider控件滑块所指的值,利用Binding进行绑定,ElementName是绑定的元素的名称,Path是在元素的多个属性中选择一个我们需要绑定的属性值。
调试程序,在改变滑块位置时,字体变大变小。
设置一个按钮,点击事件为设置Slider控件值为30:
private void btn1_Click(object sender, RoutedEventArgs e)
{
this.slider1.Value = 30;
}
字体大小也随着源的改变而改变。
当我们修改点击事件,使得点击按钮时,目标属性修改,然而源属性不会随之改变。
private void btn1_Click(object sender, RoutedEventArgs e)
{
//this.slider1.Value = 30;
this.textBlock.FontSize = 30;
}
这是一个从源->目标的单向传播过程。
如果我们想把此过程设置为一个双向过程呢?
需要将Binding 对象的Mode属性修改为Mode=TwoWay
,这样源属性与目标属性才会双向影响改变。
除了在XAML中设置绑定外,还可以在代码中设置绑定。
也可以实现同样的功能。但是大部分情况下都是在XAML文件中创建绑定,只有一些特殊情况,例如动态绑定,根据具体情况进行绑定,删除绑定的情况下才是用代码进行绑定。
取消绑定、删除绑定
使用BindingOperations的ClearAllBindings方法。创建一个取消绑定按钮:
private void btn2_Click(object sender, RoutedEventArgs e)
{
BindingOperations.ClearAllBindings(this.textBlock);
}
按下按钮后滑块textBlock的所有绑定全部消除。
还可以对TextBlock进行多属性的绑定,以下例子绑定Foreground属性:
<TextBlock Text="This is a test text." Name="textBlock" Margin="10" Foreground ="{Binding ElementName=lstBox1, Path=SelectedItem.Tag}"/>
<ListBox Margin="3" Height="auto" Name="lstBox1" >
<ListBoxItem Tag="Blue">
Blue
</ListBoxItem>
<ListBoxItem Tag="Pink">
Pink
</ListBoxItem>
<ListBoxItem Tag="SkyBlue">
SkyBlue
</ListBoxItem>
</ListBox>
绑定更新
调整滑块大小,则TextBox中的数值跟着发生了变化,然而设置的Mode为TwoWay,当我们直接在TextBox中输入字体大小,却不能立即改变字体大小和滑块位置,只有当光标离开TextBox时才会发生改变。
<TextBox Margin="3" Name="textBox1" Height="30" Width="300" Text="{Binding ElementName=textBlock, Path=FontSize, Mode=TwoWay}"/>
这是因为虽然是双向的,却不是立刻反应的模式,如果需要达到目标改变,源也立即改变的目的,就需要设置Binding对象的UpdateSourceTrigger属性为UpdateSourceTrigger=PropertyChanged
。这样就可以立即发生改变了。