WPF DataGrid编辑时第二列未实时更新问题求助
解决WPF DataGrid依赖下拉列即时更新的问题
这个问题的核心在于计算属性FilteredItems的变化没有被UI感知到,再加上默认的绑定更新时机拖慢了源数据同步,咱们一步步来修复:
1. 让FilteredItems的变化被UI监听
你的FilteredItems是依赖DropdownValue1的只读计算属性,当DropdownValue1改变时,FilteredItems的结果已经更新,但UI并不知道——因为你只触发了DropdownValue1的PropertyChanged通知,没告诉UIFilteredItems也发生了变化。
修改Customer类中DropdownValue1的setter,在通知自身之后,额外触发FilteredItems的属性变更通知:
private string _dropdownValue1; public string DropdownValue1 { get => _dropdownValue1; set { if (_dropdownValue1 != value) { _dropdownValue1 = value; OnPropertyChanged(nameof(DropdownValue1)); // 关键:通知UI FilteredItems已更新 OnPropertyChanged(nameof(FilteredItems)); } } }
2. 让第一列的选择立即同步到数据源
默认情况下,WPF的ComboBox会在失去焦点时才更新绑定源。咱们把第一列编辑模板里的SelectedValue绑定改成即时更新,确保DropdownValue1的变化立刻同步到Customer对象:
<ComboBox SelectedValue="{Binding DropdownValue1, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Value" DisplayMemberPath="Text" ItemsSource="{Binding Path=Options1}"></ComboBox>
3. 确保第二列的CellTemplate也能即时更新
第二列的CellTemplate用了MultiBinding,为了让它在DropdownValue1变化时立刻刷新显示,需要给MultiBinding加上UpdateSourceTrigger=PropertyChanged,同时确保转换器能正确处理新参数:
<MultiBinding UpdateSourceTrigger="PropertyChanged"> <MultiBinding.Converter> <local:GroupDropdownConverter /> </MultiBinding.Converter> <Binding Path="DropdownValue2" /> <Binding Path="Options2" /> <Binding Path="DropdownValue1" /> </MultiBinding>
为什么这样能解决问题?
- 第一步让UI感知到
FilteredItems的变化,第二列编辑模板里的ComboBox会重新获取过滤后的选项列表; - 第二步确保第一列的选择一改变,就立刻同步到
Customer对象的DropdownValue1,无需等待单元格失去焦点; - 第三步让第二列的显示文本也能即时刷新,不用等整行失去焦点。
这样修改后,你在第一列选完选项,第二列的下拉列表和显示内容都会立刻更新,不用离开当前行啦。
内容的提问来源于stack exchange,提问作者R. Wood
相关产品推荐
相关产品推荐

