WPF系列教程(二十四):将元素绑定到一起,数据绑定,属性之间的Binding

项目源码

数据绑定

在窗体中放置了一个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。这样就可以立即发生改变了。

猜你喜欢

转载自blog.csdn.net/qq_43511299/article/details/121612197