所有主流UI框架中Binding双向同步需满足三条件:数据类实现INotifyPropertyChanged、绑定显式声明Mode=TwoWay、正确设置DataContext/BindingContext;WPF TextBox默认OneWay需手动设TwoWay,WinForms必须用BindingSource中转,MAUI Entry同理需ObservableObject与TwoWay并存。

所有主流 UI 框架(WPF、WinForms、MAUI)里,Binding 要生效且支持双向同步,必须满足三个硬性条件:数据类实现 INotifyPropertyChanged、绑定表达式显式声明 Mode=TwoWay、控件正确关联到数据上下文(DataContext 或 BindingContext)。漏掉任意一个,就会出现“输进去了,但后台拿不到值”或“改了模型,界面不刷新”的静默失败。
WPF 中 TextBox 绑定后改不了模型值?检查 Mode=TwoWay 和 DataContext
WPF 的 TextBox.Text 依赖属性默认绑定模式是 OneWay,不是你直觉里的“双向”。用户输入后,值根本不会回写到源属性。
- 必须在 XAML 中显式写:
Text="{Binding Name, Mode=TwoWay}" -
DataContext必须在控件生命周期早期设置,推荐在Window或UserControl构造函数末尾赋值:this.DataContext = new Person(); - 如果绑定路径是嵌套的(如
Customer.Address.Street),确保每一层对象都非 null,否则绑定中断且无报错 - 输出窗口里出现
System.Windows.Data Error: 40,基本就是DataContext为空或属性名拼错(大小写敏感)
WinForms 绑定失效?BindingSource 是绕不开的中间层
WinForms 不支持直接把 List<Person> 或普通对象丢给 TextBox.DataBindings。它必须经由 BindingSource 中转,否则连初始化都可能失败。
- 先创建并配置
BindingSource:var bs = new BindingSource(); bs.DataSource = new List<Person>(); - 再绑定控件:
textBox1.DataBindings.Add("Text", bs, "Name");—— 这里的"Name"是Person类的 public 属性名 - 若
Person没实现INotifyPropertyChanged,编辑TextBox后调用bs.EndEdit()才能手动触发回写;否则只有单向初始化效果 -
DataGridView绑定时,直接设DataSource = bs即可,列的DataPropertyName对应属性名
MAUI 中 Entry 输入没更新 ViewModel?ObservableObject + Mode=TwoWay 缺一不可
MAUI 的 Entry.Text 默认也是 OneWay。即使你用了 [ObservableProperty],不写 Mode=TwoWay,用户输入照样不会触发属性 setter。
- ViewModel 必须继承
ObservableObject(推荐)或手动实现INotifyPropertyChanged - XAML 中必须写全:
<Entry Text="{Binding Username, Mode=TwoWay}" /> -
BindingContext建议在页面OnAppearing中设置,避免因生命周期顺序导致绑定丢失 - 调试时,在生成的
Username属性 setter 里加断点或日志——如果输入后没命中,优先查Mode和BindingContext
最容易被忽略的是:不同框架对“默认 Mode”的定义完全不同。WPF 的 Text 是 TwoWay,但 WinForms 的 Text 绑定必须靠 BindingSource 配合,MAUI 则一律默认 OneWay。别凭经验猜,每次都要确认。


















