如何搭配Fluent NHibernate使用WPF ComboBox实现用户选值变更后保存
方案1:通过标志位过滤SelectionChanged无效触发
新增全局标志位屏蔽初始化阶段的事件触发,同时在事件中校验选中项是否真实发生变更:
- 新增私有标志字段,修改初始化逻辑:
// 全局标志位,标记控件是否完成初始化 private bool _isComboBoxInitialized = false; private void InitExchange() { comboBoxExchange.ItemsSource = (from p in m_DbSession.Query<Exchange>() orderby p.Name select p); comboBoxExchange.DisplayMemberPath = "Name"; comboBoxExchange.SelectionChanged += comboBoxExchange_SelectionChanged; // 初始化完成后再开放事件处理 _isComboBoxInitialized = true; }
- 实现SelectionChanged事件逻辑:
private void comboBoxExchange_SelectionChanged(object sender, SelectionChangedEventArgs e) { // 过滤初始化阶段的自动触发 if (!_isComboBoxInitialized) return; // 校验选中项是否真实发生变更 if (e.AddedItems.Count > 0 && e.RemovedItems.Count > 0 && !Equals(e.AddedItems[0], e.RemovedItems[0])) { Save(); } }
方案2(推荐):利用绑定属性变更触发保存
你已经为ComboBox的SelectedItem配置了绑定,直接在绑定的ViewModel属性变更时触发保存,完全规避控件事件的无效触发问题,更符合WPF MVVM开发规范:
修改绑定的Exchange属性实现:
private Exchange _exchange; public Exchange Exchange { get => _exchange; set { // 仅在属性值真实变更时执行后续逻辑 if (_exchange != value) { _exchange = value; // 触发属性变更通知(如果你的ViewModel实现了INotifyPropertyChanged接口) OnPropertyChanged(nameof(Exchange)); // 直接调用保存方法 Save(); } } }
使用该方案可直接移除ComboBox的SelectionChanged事件注册,无需额外维护标志位,逻辑更简洁,也不会受控件焦点、初始化流程的影响。
内容的提问来源于stack exchange,提问作者Gener4tor
相关产品推荐
相关产品推荐

