【问题标题】:how do I see if Combobox Selectionchanged event is triggered manually or by binding (WPF - MVVM)如何查看 Combobox Selectionchanged 事件是手动触发还是通过绑定触发(WPF - MVVM)
【发布时间】:2014-09-29 12:08:05
【问题描述】:

每当有人更改组合框中的值时,我都需要清空模型中的属性。

这样做的副作用是,每当我更改 Combobox-Bound 变量的值时,都会触发 Combobox SelectionChanged 事件。

有没有办法知道是谁触发了这个事件。我想知道是手动触发还是绑定触发。

我正在查看发件人,但他们看起来差不多。

谢谢,

【问题讨论】:

  • 您很可能以错误的方式定位问题。在您的代码中进行适当的绑定并在那里做一些事情,而不是依赖于谁更改了它。在此处发布您想要实现的实际问题。

标签: wpf mvvm combobox selectionchanged eventhandler


【解决方案1】:

Dropodownclose 是我在这里最好使用的事件,而不是 selectionchanged。这将确保事件不是由绑定的数据触发,而是由用户界面交互触发。

【讨论】:

    【解决方案2】:

    这是 WPF 开发人员应使用 MVVM 设计模式的主要示例。通过依赖 SelectionChanged 事件来控制代码流,您将失去对应该发生的事情的控制权,而不得不知道事件是如何被触发的,以便您可以做出响应。那是被动的,而不是主动的。作为开发人员,您应该始终知道什么会影响您的代码流。

    相反,将您的 WPF 页面或控件的 DataContext 设置为包装您的模型并将您的组合框绑定到 ViewModel 属性的视图模型类,在这种情况下特别是 SelectedItem。这将极大地简化您的编码。

    视图模型

    public class ViewModel : INotifyPropertyChanged 
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public ObservableCollection<string> Names = new ObservableCollection<string>();
        private string _selectedName;
        private YourModel _model;
    
        public ViewModel(YourModel model)
        {
            _model = model;
        }
    
        public string SelectedName
        {
            get { return _model.SelectedName; }
            set
            {
                _model.SelectedName = value;
                OnPropertyChanged();
            }
        }
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    XAML

    <ComboBox ItemsSource="{Binding Names}" SelectedItem="{Binding SelectedName}" />
    

    【讨论】:

    • 我继承了一个使用 MVVM 的应用程序,但在几个地方里面有这样的东西。不幸的是,它的构建方式是业务逻辑和前端逻辑完全混合在一起。如果我将逻辑放在视图模型中,我可能会破坏一些东西,因为这个属性在所有地方都被使用。由于测试也非常有限,并且有几千个用户,每 3 个月发布一次,并且用于重构的资源有限,所以我目前不会冒险。虽然感谢您的回复。
    猜你喜欢
    • 2021-03-17
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多