wpf如何进行数据绑定与动态数据操作?

前面两篇博文,我们比较清楚的介绍了开启wpf项目已经如何生成和使用事件来操作控件,这一篇到了我们把数据放进来的时候了,没有数据实际上任何软件都是没有灵魂的,下面我们详细介绍。

文章原出处:https://blog.csdn.net/haigear/article/details/142477451

文章目录

  • 一、通过后台代码动态设置数据
    • 1、对于ComboBox
    • 2、对于ListView
  • 二、通过xaml标签Text或者content属性绑定
    • 1、给控件绑定数据源
    • 2、关于Datacontext=this
      • 为什么 DataContext 很重要?
      • 什么时候需要设置 DataContext?
    • 3、没有DataContext怎么绑定

一、通过后台代码动态设置数据

这种方式我想是任何有过C#编程经验的童鞋都不陌生的方法,无非就是在后台的代码中通过操作页面中的控件对象来实现动态添加数据。
如果你希望在页面中已有的控件上动态地添加数据,而不是在创建控件时添加,你可以使用代码后台来操作这些控件的属性。以下是针对ComboBox和ListView的示例。

1、对于ComboBox

假设你有一个已经定义好的ComboBox控件,你想要在代码中动态添加数据项。

XAML代码定义了ComboBox:

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="200" Width="300"><Grid><ComboBox x:Name="myComboBox" Margin="10" /></Grid>
</Window>

C# 代码后台动态添加数据:

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();// 假设这是动态获取的数据string[] newItems = { "Alice", "Bob", "Charlie" };// 在页面加载后添加数据myComboBox.ItemsSource = newItems;}
}

2、对于ListView

对于ListView,如果你不想使用数据绑定,可以手动添加ListViewItem。

XAML代码定义了ListView:

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="200" Width="300"><Grid><ListView x:Name="myListView" Margin="10" /></Grid>
</Window>

C# 代码后台动态添加数据:

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();// 假设这是动态获取的数据List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 },new Person { Name = "Charlie", Age = 22 }};// 在页面加载后添加数据foreach (var person in people){var listViewItem = new ListViewItem{Content = new TextBlock{Text = $"{person.Name} ({person.Age})"}};myListView.Items.Add(listViewItem);}}
}public class Person
{public string Name { get; set; }public int Age { get; set; }
}

在这个例子中,我们手动创建了ListViewItem对象,并将一个TextBlock作为内容添加到ListViewItem中,然后将ListViewItem添加到ListView的Items集合中。这种方法适用于简单的场景,但如果你需要显示复杂的数据结构或希望UI能够响应数据变化,使用数据绑定会更加方便。
文章原出处:https://blog.csdn.net/haigear/article/details/142477451

二、通过xaml标签Text或者content属性绑定

通过xaml的text属性进行绑定类似于我们以前在asp.net的页面控件操作,基本没有什么差别。这里也给出操作代码实例供大家参考。这里我们使用的技术叫做数据绑定。
数据绑定是一种将控件的属性与数据源关联起来的技术,这样当数据源发生变化时,界面上显示的数据也会自动更新。下面是一个简单的例子,演示如何为一个文本框(TextBox)控件绑定到一个简单的数据源。
显然,使用这种技术的好处就是我们不必在数据发生变化时一个个去更新数据。

1、给控件绑定数据源

首先,假设我们有一个简单的数据模型类 Person:

public class Person
{public string Name { get; set; }// 可以添加更多属性
}

然后,在你的 WPF 窗体(Window)的 XAML 中,你可以这样设置数据上下文(DataContext)和绑定:

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp" // 确保命名空间正确Title="MainWindow" Height="200" Width="300"><Grid><TextBox x:Name="txtName" HorizontalAlignment="Left" Height="23" Margin="10" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" /></Grid>
</Window>

在你的后台代码(例如 MainWindow.xaml.cs)中,设置数据上下文并绑定数据:

using System.Windows;
using WpfApp; // 确保使用正确的命名空间namespace WpfApp
{public partial class MainWindow : Window{public Person Person { get; set; }public MainWindow(){InitializeComponent();// 创建数据模型实例Person = new Person { Name = "张三" };// 设置数据上下文DataContext = this;}}
}

现在,你可以将 TextBox 的 Text 属性绑定到 Person 类的 Name 属性:

<TextBox x:Name="txtName" HorizontalAlignment="Left" Height="23" Margin="10" Text="{Binding Person.Name, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" />

特别注意
这里使用了 UpdateSourceTrigger=PropertyChanged,意味着每当 Person.Name 属性改变时,文本框的内容也会实时更新。否则不能实时更新的!!

完成以上步骤后,当 Person 对象的 Name 属性改变时,TextBox 中显示的文本也会相应更新。这是 WPF 数据绑定的基础,你可以根据需要绑定到更复杂的数据源和属性。

2、关于Datacontext=this

这一条指令,有必要单独提出来给大家解释一下,毕竟一起拿在winform中是没有这样的操作的。
在WPF中,DataContext 是一个非常重要的概念,它定义了数据绑定的上下文环境。DataContext 不是必须的,但如果不设置,你将无法直接绑定到当前窗口或用户控件的属性,除非你明确指定绑定的源对象。

为什么 DataContext 很重要?

1.简化绑定表达式:当你在XAML中定义绑定时,如果没有指定源对象,WPF会查找当前的 DataContext 作为默认的数据源。这意味着你可以省略绑定表达式中的源对象部分,从而简化绑定的书写。
2.继承性:DataContext 具有继承性。如果你在一个容器控件(如 Grid、StackPanel 等)中设置了 DataContext,那么这个容器内的所有子控件都会默认使用这个 DataContext 作为它们的绑定上下文,除非子控件另有指定。

什么时候需要设置 DataContext?

当你希望在XAML中直接绑定到当前窗口或用户控件的属性时,你需要设置 DataContext 为 this。这样,你就可以在XAML中使用相对简短的绑定表达式,例如 {Binding SomeProperty},而不需要每次都指定完整的源对象路径。
当你绑定到一个外部的数据模型时,你需要将 DataContext 设置为该数据模型的实例。这样,所有子控件的绑定都可以直接引用数据模型的属性。
示例
假设你有一个窗口,其中包含一个 TextBox,你希望将 TextBox 的 Text 属性绑定到窗口的某个属性上:

public partial class MyWindow : Window
{public string MyProperty { get; set; } // 假设这是你想要绑定的属性public MyWindow(){InitializeComponent();MyProperty = "初始值";DataContext = this; // 设置DataContext为当前窗口实例}
}

在XAML中,你可以这样设置绑定:

<TextBox Text="{Binding MyProperty}" />

由于 DataContext 已经设置为窗口本身,所以这里的 {Binding MyProperty} 就隐式地指向了当前窗口的 MyProperty 属性。

总结
DataContext 是WPF数据绑定机制的核心部分,它提供了一种方便的方式来指定默认的数据源。虽然它不是必须的,但在大多数情况下,设置 DataContext 可以使数据绑定更加简洁和直观。如果你不设置 DataContext,则需要在每个绑定表达式中明确指定源对象,这会使XAML代码变得更加繁琐。

文章原出处:https://blog.csdn.net/haigear/article/details/142477451

3、没有DataContext怎么绑定

如果你希望在不使用 DataContext 的情况下,通过在每个绑定表达式中明确指定源对象来实现数据绑定,你可以直接在绑定表达式中指定源对象。这种方式在绑定较为简单或绑定目标较少时比较直观。下面我将给出一个简单的例子,演示如何在XAML中直接指定源对象进行绑定。

假设你有一个窗口,其中包含一个 TextBox 和一个 Button,你希望当按钮被点击时,TextBox 显示一个静态字符串。

首先,在你的窗口类中定义一个字符串属性:

public partial class MainWindow : Window
{public string textForTest { get; set; } = "初始文本";public MainWindow(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){// 这里可以添加按钮点击后的逻辑textForTest = "按钮被点击后的文本";}
}

然后,在XAML中,你可以这样设置绑定:

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="200" Width="300"><Grid><TextBox Text="{Binding ElementName=theButton, Path=textForTest }" /><Button x:Name="btn" Content="点击我" Click="Button_Click" /></Grid>
</Window>

在这个例子中,TextBox 的 Text 属性通过 ElementName 指定了源对象为 btn,并使用 Path 指定了 btn的 textForTest 属性。这种方式允许你直接在XAML中指定源对象,而无需依赖于 DataContext。

注意事项
当使用 ElementName 进行绑定时,源对象必须在同一个XAML文件中,并且必须具有一个唯一的 x:Name。
这种方法适用于简单的场景,当绑定关系较为复杂或需要绑定多个控件到同一个数据源时,使用 DataContext 会更加方便和清晰。
通过这种方式,你可以避免设置 DataContext,但通常情况下,使用 DataContext 可以使你的代码更加清晰和易于管理,特别是当涉及到多个控件和复杂数据结构时。

好了,这篇有关wpf的数据操作就介绍到这里,感兴趣的童鞋可以继续关注wpf的进阶博文。
博文随时可能更新,关注:
文章原出处:https://blog.csdn.net/haigear/article/details/142477451
如果你是第一次刷到我这篇wpf博文,而没有起步的经验,可以参考我前面的博文
《WPF中如何访问控件生成和使用事件》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们是向量数据库的领军企业,我们只招TOP人才

我们是全球领先的向量数据库企业&#xff0c;业务正在快速发展&#xff0c;现开放大量岗位&#xff1a; 前端、产品经理、数据库开发工程师、C、数据库运维、数据库测试…… 我们招聘的唯一目标&#xff0c;寻找 TOP人才&#xff01; 如果你已经有丰富的经验&#xff0c;那么加…

jmeter-请求参数加密-MD5加密

方法1 &#xff1a;使用jmeter自带的函数助手digest Tool(工具)---Function Helper Dialog(函数助手对话框) 第一个参数是要md5加密的值&#xff0c;第二个参数是保存加密后值的变量 &#xff08; 此处变量是从txt文件导入的&#xff0c;所以使用的是${wd} &#xff09; …

overlayscrollbars使用

官网 https://github.com/KingSora/OverlayScrollbars 使用 <link href"https://cdn.bootcdn.net/ajax/libs/overlayscrollbars/2.10.0/styles/overlayscrollbars.css" rel"stylesheet"> <script src"https://cdn.bootcdn.net/ajax/libs/…

OMRON欧姆龙E5GN温控器手测

OMRON欧姆龙E5GN温控器手测

17【Protues单片机仿真】基于51单片机的太阳能智能谷物翻晒机器人

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;避障&#xff0c;低于50CM报警&#xff0c;LED灯亮起&#xff0c;自动翻晒用光敏电阻&#xff0c;光照强度大&#xff0c;电机转动&#xff0c;相当于翻晒粮食&#xff0…

【中间件——基于消息中间件的分布式系统的架构】

1. 基于消息中间件的分布式系统的架构 从上图中可以看出来&#xff0c;消息中间件的是 1&#xff1a;利用可靠的消息传递机制进行系统和系统直接的通讯 2&#xff1a;通过提供消息传递和消息的排队机制&#xff0c;它可以在分布式系统环境下扩展进程间的通讯。 1.1 消息中间件…

PostgreSQL的学习心得和知识总结(一百五十一)|[performance] PostgreSQL列对齐

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

算法题——滑动窗口(图示+代码)

什么时候可以使用滑动窗口&#xff1f; 当我们尝试对一条题目进行暴力插解时&#xff0c;若发现 一、长度最小的子数组 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程…

一个 Java 语言简化处理 PDF 的框架,提供了一套简单易用的 API 接口,满足多样化需求又能简化开发流程的处理方案(附教程)

前言 当前市面上处理 PDF 文件的工具众多&#xff0c;但它们往往存在一定的局限性&#xff0c;比如复杂交互、功能单一等问题。尤其对于那些需要频繁生成或编辑 PDF 文档的应用场景来说&#xff0c;找到一个既能满足多样化需求又能简化开发流程的处理方案显得尤为重要。那么&a…

借用连接2-得到主库或从库池子连接

二、借用连接--AbstractRoutingDataSource类 目的&#xff1a;基于look up data&#xff0c;然后从目标数据源借用连接 注look up key确定走主 or 从数据库连接池代码开发&#xff1a; 1.定义子类继承AbstractRoutingDataSource&#xff0c;并覆写determineCurrentLookupKey方…

Python 从入门到实战30(高级文件的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了操作目录的相关知识。今天我们将学习一下高级文…

性能监控之Python实战SkyWalking链路追踪

文章目录 一、介绍二、SkyWalking支持的语言三、SkyWalking安装3.1 前提准备3.2 先安装ElasticSearch7.X3.3 Skywalking-OAP 安装3.4 Skywalking-UI 界面安装3.5 访问页面检查SkyWalking是否可以访问 四、Python 项目接入SkyWalking4.1 演示项目代码4.2 验证 sw-python4.3 配置…

AI会议时代:企业如何搭上快车?

“我 们认为&#xff0c;AI绝不仅是会议的辅助工具&#xff0c;而更会是重塑会议流程的关键力量。通过AI的个性化定制、大规模支持、智能分析这些技术&#xff0c;AI会议将大大提升会议的智能化与高效性&#xff0c;进而成为企业数字化转型的核心驱动力。” 作者|斗斗 编辑…

webdav解说

WebDAV&#xff08;Web Distributed Authoring and Versioning&#xff09;是一种基于HTTP/1.1协议的扩展&#xff0c;它允许用户通过网络进行文件的上传、删除、编辑等操作&#xff0c;从而实现远程文件管理。 WebDAV 是一种网络文件共享协议&#xff0c;它扩展了HTTP协议&am…

THREE.JS法线Shader

以普通情况而论 vNormal normal;//...gl_FragColor vec4( vNormal, 1. );vNormal normal;//...gl_FragColor vec4( normalize( vNormal ) * 0.5 0.5, 1. );vNormal normalMatrix * normal;//...gl_FragColor vec4( normalize( vNormal ) * 0.5 0.5, 1. );normalMa…

【Java异常】(简简单单拿捏)

【Java异常】&#xff08;简简单单拿捏&#xff09; 1. 异常的简单介绍2. 异常的抛出2.1 语法 3. 异常的处理3.1 异常声明throws3.2 try-catch捕获并处理 4. 例子&#xff08;try-catch自定义异常&#xff09; 1. 异常的简单介绍 程序员在运行代码时会遇到很多异常&#xff0c…

Linux系统安装MySQL8.40(保姆级教程)

前言&#xff1a; 说明&#xff1a;本文章是在阿里云ecs上安装MySQL&#xff0c;即&#xff1a;Linux是在联网状态下。 一、安装前环境准备 1.查看MySQL应用是否已存在 rpm -qa |grep mysql说明&#xff1a;若返回空信息&#xff0c;就说明当前环境没有安装MySQL。 2.查看ma…

解决方案:如何区分python里面绝对路径跟相对路径的不同

文章目录 一、现象二、解决方案 一、现象 在工作中&#xff0c;会经常混淆绝对路径跟相对路径的区别&#xff0c;我也是找了资料之后就懂了&#xff0c;但时间一长就混淆了&#xff0c;于是&#xff0c;我在这里记录下 二、解决方案 在Python中&#xff0c;绝对路径和相对路…

关于el-card的height设置100%后, el-card内容超出高度后,内容被隐藏这件事

1. 解决方法 全局样式添加以下代码 .el-card__body{height: 100%;width: 100%; }2. 问题原因 代码 <el-card style"height: 100%"><!-- ... --> </el-card>选中.el-card 元素发现这里的 .el-card 的 overflow:hidden 而内部 .el-card__body除…

WiFi无线连接管理安卓设备工具:WiFiADB

介绍 WiFi ADB 使您能够通过 WiFi TCP/IP 连接直接在设备上轻松调试和测试 Android 应用&#xff0c;无需使用 USB 数据线。在启用 WiFi 上的 ADB 后&#xff0c;打开控制台将电脑连接到设备。 手机和电脑在同一个WiFi然后电脑上运行adb connect x.x.x.x:x命令即可 下载 谷…