WPF SelectionChanged为相同的值

我在ComboBox项目中使用SelectionChanged,但是当我再次选择相同的项目时,SelectionChanged函数不会触发,我需要它来执行此操作。 我怎么能告诉它不要解雇我做的选择。

private void ComboBox_SelectionChanged4(object sender, SelectionChangedEventArgs e) { //do some stuff } 

XAML:

       

添加项目:

 for (int i = 0; i < Pr4.Count(); i++) { ComboBoxItem item = new ComboBoxItem(); item.Content = Pr4[i]; Combo4.Items.Add(item); } 

我用了DropDownClosed,谢谢 – 克莱门斯

我有同样的问题 ,我终于找到了答案:

您需要像这样处理SelectionChanged事件和DropDownClosed:

在XAML中:

  1 2 3  

在C#中:

 private bool handle = true; private void ComboBox_DropDownClosed(object sender, EventArgs e) { if(handle)Handle(); handle = true; } private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { ComboBox cmb = sender as ComboBox; handle = !cmb.IsDropDownOpen; Handle(); } private void Handle() { switch (cmbSelect.SelectedItem.ToString().Split(new string[] { ": " }, StringSplitOptions.None).Last()) { case "1": //Handle for the first combobox break; case "2": //Handle for the second combobox break; case "3": //Handle for the third combobox break; } } 

您可以使用打开的下拉列表将选择设置为-1。 然后在事件处理程序中,您需要忽略该更改。 在下拉关闭事件中,如果控件关闭,您可以恢复原始值。(同时忽略此更改)

您可以将事件处理程序绑定到combobox的onclickevent,然后检查所选项是否为null

为此,您必须为combobox中添加的每个项目添加鼠标添加事件。

使用DropDownOpen和DropDwonClose的行为

 public class InvokeIfSameElementSelectedBehavior : Behavior { #region public ICommand Command private static readonly PropertyMetadata CommandMetaData = new PropertyMetadata(default(ICommand)); public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(InvokeIfSameElementSelectedBehavior), CommandMetaData); public ICommand Command { get { return (ICommand)GetValue(CommandProperty); } set { SetValue(CommandProperty, value); } } #endregion //public ICommand Command private bool _skipSelectionChanged; private bool _popupMouseClicked; private Popup _popup; private object _previousValue; protected override void OnAttached() { base.OnAttached(); if(AssociatedObject.IsLoaded) AttachAllEvents(); else AssociatedObject.Loaded += AssociatedObjectOnLoaded; } private void AssociatedObjectOnLoaded(object sender, RoutedEventArgs routedEventArgs) { AssociatedObject.Loaded -= AssociatedObjectOnLoaded; AttachAllEvents(); } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.SelectionChanged -= AssociatedObjectOnSelectionChanged; AssociatedObject.DropDownOpened -= AssociatedObjectOnDropDownOpened; AssociatedObject.DropDownClosed -= AssociatedObjectOnDropDownClosed; if(_popup != null) _popup.PreviewMouseLeftButtonDown -= PopupOnPreviewMouseLeftButtonDown; } private void AttachAllEvents() { AssociatedObject.SelectionChanged += AssociatedObjectOnSelectionChanged; AssociatedObject.DropDownOpened += AssociatedObjectOnDropDownOpened; AssociatedObject.DropDownClosed += AssociatedObjectOnDropDownClosed; AssociatedObject.ApplyTemplate(); _popup = (Popup)AssociatedObject.Template.FindName("PART_Popup", AssociatedObject); if(_popup != null) _popup.PreviewMouseLeftButtonDown += PopupOnPreviewMouseLeftButtonDown; } private void AssociatedObjectOnDropDownOpened(object sender, EventArgs e) { _popupMouseClicked = false; _previousValue = AssociatedObject.SelectedItem; } private void AssociatedObjectOnDropDownClosed(object sender, EventArgs e) { try { if (_popupMouseClicked && Equals(AssociatedObject.SelectedItem, _previousValue)) //SelectionChanged handles it if value are not the same InvokeChangeCommand(AssociatedObject.SelectedItem); } finally { _popupMouseClicked = false; } } private void PopupOnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { //ignore clicks on the scrollbars if(e.Source is ScrollViewer) return; _popupMouseClicked = true; } private void AssociatedObjectOnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (_skipSelectionChanged) return; try { _skipSelectionChanged = true; if (e.AddedItems.Count != 1) return; InvokeChangeCommand(e.AddedItems[0]); } finally { _skipSelectionChanged = false; } } private void InvokeChangeCommand(object item) { if (Command == null) return; if (!Command.CanExecute(item)) return; Command.Execute(item); } } 

样品: