在Windows Presentation Foundation (WPF)中,数据绑定是一种强大的特性,它允许开发者将UI元素与数据源连接起来,实现数据的自动更新和显示。数据绑定的核心在于减少手动更新UI的代码,提高应用程序的响应性和可维护性。
在WPF中,绑定路径用于指定绑定的数据源中的属性,而数据上下文(DataContext)则指定了控件绑定的数据源。通过设置DataContext,可以简化绑定的设置过程
简单的数据绑定列如两个控件(输入框输入的内容显示到Label 在WinFrom需要在后台写代码而在wpf可以不需要在后台写代码来实现)严肃来说这是元素绑定
数据绑定最简单的形式是,源对象是WPF元素而且源属性是依赖属性。依赖项属性具有内置的更改通知支持,当在源对象中改变依赖项属性的值时,会立即更新目标对相中的绑定属性。
<!--Xaml程序 --> <Grid> <StackPanel> <TextBox x:Name="t1"/> <!-- 绑定其Text,双向绑定,属性改变时更新 --> <TextBlock Text="{Binding ElementName=t1 ,Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> </Grid>
WPF支持多种数据绑定模式,其中包括:
单向绑定(OneWay):数据源到目标控件的单向更新。当数据源发生变化时,绑定的UI元素会自动更新,但UI元素的变化不会反馈到数据源。
双向绑定(TwoWay):数据源和目标控件之间的双向更新。不仅UI元素会随数据源变化而更新,用户对UI元素的操作也会同步到数据源中。
数据绑定:
<!--数据绑定:把数据以一个变量的方式绑定到一个标签上,以后可以通过对变量修改,达到修改属性的目的 --> <!--之前修改某一个label标题,之前写法this.l1.content="李四" 数据绑定写法:label content ={Bind path = title} 修改时候通过修改title即可达到修改content目的--> <!--一个完整数据绑定必须包含这四个组件:给label的标题属性content绑定一个数据name=张三值 1 绑定的目标 eg:label 2 目标属性 eg:content 3 绑定源 eg:name所在对象 4 值的路径 eg:name的路径一般写成属性名 -->
<!--绑定数据的过程:1-5--> <!--1 定义数据源: 就是创建一个类,里面添加属性以及初始值即可,创建一个文件 Entity实体文件夹--> <!--2 导入实体类: xmlns:c ="clr-namespace:WpfProgram.Entity"--> <!--3 指定数据源--> <Grid.Resources> <!--指定grid下可以使用的数据源--> <!--x:Key MyData对象设置一个key,根据这个key可以获取Mydata数据--> <c:MyData x:Key="mydataScource"/> </Grid.Resources> <!--4 设置或着获取参与数据绑定时候的上下文,(通俗来讲以后可以在代码里面获取对象)--> <Grid.DataContext> <Binding Source="{StaticResource mydataScource}"/> </Grid.DataContext> <!--5 绑定到目标标签上 label:{Bingding path=对象模型属性}--> <Label Content="{Binding Path=Name}" FontSize="20" Width="100" Height="40" Background="red"> </Label>
数据绑定界面更新需要继承接口INotifyPropertyChanged接口
<Grid Name="g1"> <!--1 创建绑定模型继承于INotifyPropertyChanged 实现接口提供的委托方法 public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged(string propertyName) { //当属性修改的时候触发PropertyChanged事件,紧跟着调用该函数 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } 2 导入模型命名空间 xmlns:c ="clr-namespace:WpfProgram.Entity" 3 配置数据源和上下文对象 24-29行 --> <Grid.Resources> <c:Student x:Key="s1" /> </Grid.Resources> <Grid.DataContext> <Binding Source="{StaticResource s1}" /> </Grid.DataContext> <!--把数据绑定给Grid标签,Grid下子标签都可以使用--> <Label Width="100" Height="40" Background="{Binding Path=ColorName}" Content="{Binding Path=Name}" VerticalAlignment="Top"> </Label> <Label Width="100" Height="40" Background="{Binding Path=ColorName}" Content="{Binding Path=Age}" Margin="0,50" VerticalAlignment="Top"></Label> <Label Width="100" Height="40" Background="{Binding Path=ColorName}" Content="{Binding Path=Height}" Margin="0,100" VerticalAlignment="Top"></Label> <Label Width="100" Height="40" Background="{Binding Path=ColorName}" Content="{Binding Path=Weight}" Margin="0,150" VerticalAlignment="Top"></Label> <Label Width="100" Height="40" Background="{Binding Path=ColorName}" Content="{Binding Path=Sex}" Margin="0,200" VerticalAlignment="Top"></Label> <Button Width="100" Height="40" Content="点击" Click="Button_Click"> </Button> </Grid>
private void Button_Click(object sender, RoutedEventArgs e) { //之前写法 this.l1.content = "ls" this.l2.content = "ls" //现在通过修改属性 达到界面更新的效果 Student s1 = new Student(); s1.Name = "鲁提辖"; s1.Age = 60; s1.Height = 190; s1.Weight = 100; s1.Sex = false; s1.ColorName = "yellow"; //重新绑定数据源 //设置grid的上下文对象 g1.DataContext = s1; }
Entity文件夹Student实体类
开发写法
设置数据源 DataContext 写法
1 <Grid.DataContext> <Binding Source="{StaticResource mydataScource}"/> </Grid.DataContext> 2 代码写法 g1.DataContext = b; 控件name=数据源 3 在window DataContext="{Binding Source={StaticResource Locator},Path=AddCargoType}" 4 使用ElementName 绑定指定数据