WPF绑定仅在XAML热重载后生效,DataGrid属性变更不刷新问题
问题根因
- 核心原因是你的数据源类
CustomClass没有实现INotifyPropertyChanged接口,StringPropertyB属性值变更后没有向UI发送变更通知,UI不会主动刷新渲染。你修改XAML时触发了VS的热重载逻辑,会强制刷新整个DataGrid的渲染,所以才会显示最新的属性值。 DT_LostFocus事件逻辑存在明显错误:你先判断StringPropertyA为空或null,紧接着又对空值执行DateTime.TryParse,这个判断分支永远不会命中,属性B的修改逻辑实际不会执行。- 模板列的ComboBox存在绑定冲突:同时绑定
SelectedValue和SelectedItem到同一个StringPropertyB,两个双向绑定会互相干扰,导致取值异常。
修复步骤
- 给
CustomClass实现INotifyPropertyChanged接口,在属性的set方法中触发变更通知,示例代码如下:
public class CustomClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private string _stringPropertyB; public string StringPropertyB { get => _stringPropertyB; set { _stringPropertyB = value; OnPropertyChanged(); } } // StringPropertyA也按相同规则修改,确保变更通知正常触发 }
- 修正LostFocus事件中的判断逻辑,把空值判断取反:
private void DT_LostFocus(object sender, RoutedEventArgs e) { foreach (CustomClass custom in DT.ItemsSource) { // 先判断StringPropertyA不为空再执行解析 if (!string.IsNullOrEmpty(custom.StringPropertyA) && DateTime.TryParse(custom.StringPropertyA , out DateTime date)) { custom.StringPropertyB = OtherOperations(date); } } }
- 删除ComboBox中多余的绑定,仅保留一个和
StringPropertyB的绑定即可:
<ComboBox SelectedValue="{Binding StringPropertyB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding ElementName=Combobox, Path=ItemsSource}" Style="{DynamicResource ComboBoxStyle1}"> </ComboBox>
- 可选优化:不需要在DataGrid的LostFocus事件里遍历所有数据源更新,直接在
StringPropertyA的set方法中计算StringPropertyB,逻辑更内聚、执行效率更高。
内容的提问来源于stack exchange,提问作者Alex Jud
相关产品推荐
相关产品推荐

