WPF 数据绑定笔记:属性 vs 字段,为什么绑定会失效?
Binding 只能绑定到 public 的属性(Property),不能绑定到字段(Field)
目标:搞懂“为什么字段不能绑定,属性才可以”
我们的代码长这样XAML(界面):12345<Grid> <TextBlock Text="姓名:" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center"> <Run Text="{Binding Person.Name}" /> </TextBlock></Grid>
C#(后台):1234567891011121314151617181920212223// ViewModelpublic class MainViewModel{ public Person Person { get; set; } // ← ...
数据绑定相关概念理解
中文译本将 Data Binding 译为了数据绑定,很大程度上其实是拼音音译,没有实际意义。WPF 中的Binding 更多地是表达一种桥梁关系。Binding 对象的两端,分别是源(Source)和目标(Target),源即数据来源,目标就是数据要到达的地方。一般情况下,源一般是逻辑层的对象,目标是UI层的控件对象,数据由源通过 Binding 对象送达 UI 层,也就完成的数据驱动UI的过程。
如图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。 该图演示了以下基本的 WPF 数据绑定概念:
通常情况下,每个绑定具有四个组件:
绑定目标对象(Binding Target - Dependency Object)
目标属性(Dependency Property)
绑定源(Binding Source - Object)
指向绑定源中要使用的值的路径(Path - Property)
例如,如果将 TextBox 的内容绑定到 Employee.Name 属性,则可以类似如下所示设置绑定:
目标 | TextBox
目标属性 | Text
源对象 | Employ ...
Win11光标变白的解决方案
新建文件 ,以.reg 结尾 ,名字随便 ,然后插入下面代码即可
1234Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Dwm]"OverlayTestMode"=dword:00000005
最后记得要重启电脑才可以
关闭Edge浏览器页面的圆角效果
起因edge浏览器的这个圆角我看着不太习惯 ,特别是在看一些博客文章的时候 ,总感觉不太舒服 ,所以想给他关闭掉
关闭或者开启设置
在浏览器搜索框输入edge://flags
然后再在页面的搜索框中输入Microsoft Edge rounded corners
开启圆角:它默认是Default 效果和Enable一样 ,会开启圆角
关闭圆角:选择 Disable 即可
然后重启浏览器就行了
观五行以明道
何为五行?
金:主坚韧,牢固。
天行健,君子以自强不息;地之坤,君子以厚德载物。金元素所发挥的坚韧是很了不起的,人类那坚韧不拔的骨气与精神便是最好的诠释。外圆内方,顽强不屈。金所迸发出的力量虽然是反人性的,但同样也是高等生命区别于低等生命的又一对比。
木:主连接,扎根
人类最美好的品质其实就是链接世界的能力。爱恨情仇从中发挥桥梁纽带的作用。相互支持,阴阳转换。物理学中有一个“能量守恒定律”的专有名词。把这一规律放大化就是“熵增”和“熵减”的相互转化。太极生两仪,两仪生四象。所有的能量都会由高流入低。所以说,宇宙第一规律就是能量转化。高维生命在发展过程中必然要依靠低维生命存续能量,不断发展,不断强大。人类追求中的正能量极:爱,乐观,阳光,包容,松弛以及信任与负能量极:嫉妒,贪婪,怨恨和怀疑之间也存在互相转换,互相吸收的连接关系。
水:主流动,柔和
《道德经》中讲:“水利万物而不争”。在人世间,水的力量也是无限的,一场海啸足 ...
WPF学习记录
人最好的状态就是销声匿迹 ,半隐半藏 ,自我沉淀
WPF基础学习 北のWPF学习记录
029-ButtonBase基类 030-Button按钮 031-ToggleButton基类 032-CheckBox复选框 033-RadioButton单选框 034-RepeatButton重复按钮 035-Label标签 036-TextBlock文字块 037-TextBox文本框(还未学)
百天打卡
圣人以心束行 ,君子以行束心
北の百日打卡
2025-10-12 10:51
第00天打卡 ,不要忘记了自己最开始的一个初心
读写本地ini文件
生成本地ini文件代码展示:
1234567891011121314/// <summary>/// 系统配置文件路径/// </summary>private string sysInfoPath = Application.StartupPath + "\\Sysinfo.ini";/// <summary>/// 系统配置文件服务类/// </summary>private SysInfoService sysInfoService = new SysInfoService();public FrmMain(){ InitializeComponent(); sysInfoService.SetSysInfoToPath(new SysInfo() , sysInfoPath);}
不难发现 ,通信参数少了一个 ,应该是四个的 ,原因:IP地址是字符串
解决方案:写入一个默认的字符串
这里就正常了
读取ini信息笑死 ,自己粗心大意 ,断点打错地方了 ,使劲排查错误 ,真的 ...
Winform无边框窗体拖动功能实现
1. 设置无边框模式选中要去除边框的窗体,按F4调出其属性面板,在属性面板中找到 FormBorderStyle ,并选择 None,即可将窗体设置成无边框模式;默认是无法随意拖动的,也没有最大化最小化关闭按钮。
2. 通过Panel控件实现窗体移动实现方法 :在窗体的头部添加 Panel 控件,通过 Panel 的 MouseDown、MouseMove 事件实现窗体移动;(这里的话可以添加一个背景色更好)
实现原理: 直接通过修改窗体位置从而达到移动窗体的效果;
代码实现:
1234567891011121314151617181920212223//定义一个位置信息Point用于存储鼠标位置private Point mpoint;/// <summary>/// 鼠标移动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pane ...
DataGridView表格控件使用说明
可以添加和编辑列
设置头部
设置列的样子:
设置高度 ,需要多个属性配合使用
完全居中 ,每个列都需要进行设置
效果展示:
数据绑定先设置属性123456public class SysAlarm{ public string AlarmTime { get; set; } public string AlarmInfo { get; set; } public string Operator { get; set; }}
初始化绑定这个需要在FrmMain 方法里面去进行添加
12345678910111213141516171819202122// 初始化绑定List<SysAlarm> alarmList = new List<SysAlarm> ();alarmList.Add(new SysAlarm(){ AlarmTime = DateTime.Now.ToString(), AlarmInfo = "系统报警信息 ...
WinForm 计时器 Timer 学习笔记
1. Timer 是干啥的?就是个“自动闹钟”:你设定每隔多少毫秒(比如 1000 毫秒 = 1 秒),它就自动执行一段代码。
常见用途:
实时显示时间
倒计时
定时刷新数据
轮询状态
2. 怎么用?三步搞定(WinForm 拖控件方式)第一步:拖一个 Timer 到窗体
打开设计器
工具箱 → 找到 Timer(在“组件”里)
拖到窗体上 → 它不会出现在界面上,而是在窗体底部显示为 timer1
第二步:设置两个关键属性选中底部的 timer1,在属性窗口里改:
属性
值
说明
Interval
1000
每隔多少毫秒触发一次(1000 = 1秒)
Enabled
True
必须设为 True! 否则 Timer 是“关着的”,不会跑
⚠️ 默认 Enabled = False!这是大多数人写了代码却不生效的原因!
第三步:写要执行的代码
双击底部的 timer1
Visual Studio 会自动生成 timer1_Tick 方法
在里面写你要定时干的事,比如:
1234private void timer1_Tick(object s ...
多状态循环泵控件开发
所遇问题描述:在使用定时器设置泵的运行状态时 ,可以成功运行 ,但是会一卡一卡的
这里猜测的是定时器时间设置过短导致它本身一个周期还未运行完成就重新开启下一轮的运行
但是将时间设置大了之后 ,结果并不是这样子的 ,还是会出现一卡一卡的状态
解决办法对其进行一个变化更新 ,也就是拿它的当前值与上次值去进行一个对比 ,如果不一样 ,就说明值发生了 ,这个时候再去进行一个更新
代码展示:
123456private void updateTimer_Tick(object sender, EventArgs e){ // 模拟从PLC读取一个泵的状态数据 bool state = true; this.pump1.PumpState = state ? NorthControLib.PumpState.运行 : NorthControLib.PumpState.停止;}
123456789101112131415161718192021222324252627282930[Browsable(true)] // 是否显示属性[Category(& ...
使用100%缩放比例重新启动Visual Studio 界面模糊的解决方案
问题描述建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值
昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变大了 ,但是看着异常难受 ,很模糊
解决方案
新建应用程序清单文件(Application Manifest File) , 保持默认名称 app.manifest,点击添加。
找到这段代码:
12345<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings></application>
替换DPI相关配置:
12345678&l ...
对象初始化器的使用方法
1. 什么是对象初始化器?对象初始化器就是一种在创建对象的同时,直接给属性赋值的写法。不用先 new 一个对象,再一行一行地赋值。
它的作用是用来给对象初始化的
一定存在:必然要执行构造方法
2. 构造方法与对象初始化器有什么区别
3. 传统写法 vs 初始化器写法传统写法(啰嗦):1234var person = new Person();person.Name = "张三";person.Age = 25;person.City = "北京";
4. 初始化器写法(简洁):123456var person = new Person{ Name = "张三", Age = 25, City = "北京"};
看出来没?就是把赋值操作直接塞到 new 语句里,用大括号 {} 包起来。
4. 基本规则
属性必须是 public 的(或者有 public 的 set 访问器)
用逗号分隔各个属性赋值
最后一条不用加分号(但加了也不报错)
不需要调用构 ...