You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何搭配Fluent NHibernate使用WPF ComboBox实现用户选值变更后保存

方案1:通过标志位过滤SelectionChanged无效触发

新增全局标志位屏蔽初始化阶段的事件触发,同时在事件中校验选中项是否真实发生变更:

  1. 新增私有标志字段,修改初始化逻辑:
// 全局标志位,标记控件是否完成初始化
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;
}
  1. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:09:04