在WPF中:
UpdateSourceTrigger= 只决定“什么时候”把值推回源;
Mode= 决定“要不要”推回源。
默认 Mode=OneWay 时,绑定引擎根本不会注册“目标→源”的管道,你就算把 UpdateSourceTrigger 写成 PropertyChanged 也没人监听,自然一次回写都不会发生。
PasswordBox 的附加属性默认就是 OneWay,所以必须显式 Mode=TwoWay 才开通回写通道;
而普通 TextBox.Text 默认自带 TwoWay,因此过去你只写 UpdateSourceTrigger=PropertyChanged 就够了——不是 PropertyChanged 神通广大,而是人家通道本来就开着。
以下是常见的控件UpdateSourceTrigger和Mode的默认值
控件 | 依赖属性 | 默认 Mode | 默认 UpdateSourceTrigger | 备注(记不住就看这行) |
---|---|---|---|---|
TextBox | Text | TwoWay | LostFocus | 只写 UpdateSourceTrigger=PropertyChanged 就能实时回写,不用再写 TwoWay。 |
PasswordBox | Password (附加) | OneWay | Explicit | 必须显式 Mode=TwoWay 否则根本不会回写;触发时机由你自己在附加属性里调用 UpdateSource() 。 |
TextBlock | Text | OneWay | (无) | 纯显示,不回写。 |
Button | Command | OneWay | (无) | 命令只从 VM→控件,不需要回写。 |
Button | Content | OneWay | (无) | 一般只用来显示字符串/图标。 |
Button | CommandParameter | OneWay | (无) | 参数从 VM→控件,按钮自己不会改它。 |
CheckBox | IsChecked | TwoWay | PropertyChanged | 勾选状态立即回写,不用加任何额外设置。 |
RadioButton | IsChecked | TwoWay | PropertyChanged | 同上。 |
ComboBox | SelectedItem / SelectedValue | TwoWay | PropertyChanged | 下拉选择即时回写。 |
ListBox | SelectedItem / SelectedValue | TwoWay | PropertyChanged | 与 ComboBox 一致。 |
ListView | SelectedItem / SelectedValue | TwoWay | PropertyChanged | 同上。 |
DataGrid | SelectedItem / SelectedValue | TwoWay | PropertyChanged | 行选择即时回写;单元格编辑默认走 RowEditEnding 才提交(等于 LostFocus 行为)。 |
Slider | Value | TwoWay | PropertyChanged | 拖动滑块实时回写。 |
DatePicker | SelectedDate | TwoWay | PropertyChanged | 日期选择即时回写。 |
ItemsControl | ItemsSource | OneWay | (无) | 集合只从 VM→控件;若要回写请另外暴露命令或属性。 |