简单的说,数据绑定是一种关系。
这个关系在WPF程序中体现为从某个对象中提取信息,然后将信息应用到另一个对象中。
1、绑定表达式
我们设置一个滑动条,通过滑动条的Value值控制下方文本的字体大小
<Window x:Class="_23.Binding_Elements.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel Margin="5">
<Slider Height="Auto" Name="slider1" Margin="3"
Minimum="10" Maximum="50" Value="20"
TickPlacement="TopLeft" TickFrequency="1"/>
<TextBlock Height="Auto" Name="textBlock1" Text="测试文本" Margin="10"
FontSize="{Binding ElementName=slider1,Path=Value}"/>
</StackPanel>
</Grid>
</Window>
我们在文本框中的FontSize里面利用课绑定表达式,ElementName指的是绑定的控件名称,Path指的是绑定到该控件的哪一个属性,然后我们就可以运行程序看效果:
2、绑定错误
这种绑定方式有一个问题,就是当我们Path的值设置错误时,比如我们设置为"Value1",这个属性为Slider控件不存在的一个属性,那么此时WPF程序也不会报错,这种绑定错误只会导致功能无法实现,但是程序还是可以运行。
3、绑定模式
绑定模式主要设置的是源对象和目标对象之间的绑定关系,默认的为单向。即源对象属性更改,目标对象的相应绑定的属性也发生更改,但是目标对象的属性更改时,不会影响源对象的属性。
我们可以设置绑定的模式为TwoWay,这样无论更改哪一个属性,相对的属性都会发生更改。
4、使用代码创建绑定关系
我们也可以不使用XAML语句,把XAML的绑定语句注释掉,通过C#代码来创建绑定的关系
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Binding bind = new Binding();//新建一个绑定类
bind.Source = slider1;//设置绑定源对象
bind.Path = new PropertyPath("Value"); //设置绑定源属性
bind.Mode = BindingMode.TwoWay;//设置绑定模式;
this.textBlock1.SetBinding(TextBlock.FontSizeProperty,bind);//设置绑定目标对象
}
产生的效果是一样的。
我们还可以设置多重绑定关系,通过ListBox的ListItem来设置文本的颜色属性。
<Window x:Class="_23.Binding_Elements.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<StackPanel Margin="5">
<Slider Height="Auto" Name="slider1" Margin="3"
Minimum="10" Maximum="50" Value="20"
TickPlacement="TopLeft" TickFrequency="1"/>
<TextBlock Height="Auto" Name="textBlock1" Text="测试文本" Margin="10"
Foreground="{Binding ElementName=listBox1,Path=SelectedItem.Tag}"/>
<!--FontSize="{Binding ElementName=slider1,Path=Value, Mode=TwoWay}"-->
<Button Margin="5" Content="设置滑动条为30" Height="Auto" Name="button1" Width="Auto" Click="button1_Click" />
<Button Margin="5" Content="取消绑定" Height="Auto" Name="button2" Width="Auto" Click="button2_Click" />
<ListBox Margin="5" Height="Auto" Name="listBox1" Width="Auto">
<ListBoxItem Tag="Red">Red</ListBoxItem>
<ListBoxItem Tag="Green">Green</ListBoxItem>
<ListBoxItem Tag="Blue">Blue</ListBoxItem>
</ListBox>
</StackPanel>
</Grid>
</Window>
效果如下:
5、绑定更新
我们可以设置一个文本输入框,让用户直接输入字体的大小,输入完成后立马更新到文本字体的显示大小属性上
<Window x:Class="_23.Binding_Elements.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<StackPanel Margin="5">
<Slider Height="Auto" Name="slider1" Margin="3"
Minimum="1" Maximum="50" Value="20"
TickPlacement="TopLeft" TickFrequency="1" IsSnapToTickEnabled="True"/>
<TextBlock Height="Auto" Name="textBlock1" Text="测试文本" Margin="10"
Foreground="{Binding ElementName=listBox1,Path=SelectedItem.Tag}"/>
<!--FontSize="{Binding ElementName=slider1,Path=Value, Mode=TwoWay}"-->
<Button Margin="5" Content="设置滑动条为30" Height="Auto" Name="button1" Width="Auto" Click="button1_Click" />
<Button Margin="5" Content="取消绑定" Height="Auto" Name="button2" Width="Auto" Click="button2_Click" />
<ListBox Margin="5" Height="Auto" Name="listBox1" Width="Auto">
<ListBoxItem Tag="Red">Red</ListBoxItem>
<ListBoxItem Tag="Green">Green</ListBoxItem>
<ListBoxItem Tag="Blue">Blue</ListBoxItem>
</ListBox>
<TextBox Margin="5" Height="23" Name="textBox1" Width="Auto"
Text="{Binding ElementName=textBlock1, Path=FontSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
</Window>