WPF数据绑定

在Windows Presentation Foundation (WPF)中,数据绑定是一种强大的特性,它允许开发者将UI元素与数据源连接起来,实现数据的自动更新和显示。数据绑定的核心在于减少手动更新UI的代码,提高应用程序的响应性和可维护性。

  • 在WPF中,绑定路径用于指定绑定的数据源中的属性,而数据上下文(DataContext)则指定了控件绑定的数据源。通过设置DataContext,可以简化绑定的设置过程

  • 简单的数据绑定列如两个控件(输入框输入的内容显示到Label 在WinFrom需要在后台写代码而在wpf可以不需要在后台写代码来实现)严肃来说这是元素绑定

  • 数据绑定最简单的形式是,源对象是WPF元素而且源属性是依赖属性。依赖项属性具有内置的更改通知支持,当在源对象中改变依赖项属性的值时,会立即更新目标对相中的绑定属性。

cs 复制代码
<!--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元素的操作也会同步到数据源中。

  • 数据绑定:

cs 复制代码
      <!--数据绑定:把数据以一个变量的方式绑定到一个标签上,以后可以通过对变量修改,达到修改属性的目的        
-->
         <!--之前修改某一个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的路径一般写成属性名
        -->
cs 复制代码
   <!--绑定数据的过程: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接口

cs 复制代码
  <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>
cs 复制代码
 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 绑定指定数据
相关推荐
SamChan901 小时前
用Playwright端到端测试PDF翻译功能:Web自动化测试实战
前端·python·ai·pdf·wpf
Now喔3 小时前
WPF动画
wpf
牛哇网络工作室11 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
zlinear数据采集卡21 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel1 天前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡1 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
kingwebo'sZone1 天前
C# 根据公式计算的方法
开发语言·c#
阿部多瑞 ABU1 天前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D1 天前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram2 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具