如何从附加在其上的行为触发组合框SelectionChanged事件

本文关键字:组合 事件 SelectionChanged | 更新日期: 2023-09-27 18:14:24

我有一些ComboBox控件,每个控件都有一些值。每个选定的值触发我的一个事件。当项目从ComboBoxA中被选中时,我的事件被选中项目的值触发。当我的一个组合框只是打开和关闭,其中没有改变任何值时,不会触发事件(这是组合框的默认行为)。但这不是我需要的。

我所做的,是创建一个行为,将与DropDownClosed事件相关联,但我不知道如何触发SelectionChanged事件。

编辑:

这个问题可以推广为:如何"手动"触发一个UI控件的事件?或者-是否有一种方法来调用与事件相关的方法?

编辑2:

我尽量把这个问题解释得更清楚些。我有这个代码,它接受一个项目列表,并将它们显示为类别(单选按钮)和类别下的项目(单选按钮内的组合框)。当选择一个项目时,将触发选择更改事件。好的!当选择另一个单选按钮时,将触发一个事件。好吧! !

不工作的特殊情况(作为ComboBox行为的默认值):当打开一个未选中的组合,然后关闭它而不改变其选择-没有事件被触发。但是-这个组合是在一个没有选择的类别,我想现在被选中,因为用户认为它。我的想法是使用行为(是在xaml代码,但到目前为止还没有工作…)

代码(more or less…):

<ListBox ItemsSource="{Binding Categories}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <RadioButton Content="{Binding CategotyName}" GroupName="TestCategory" IsChecked="{Binding IsSelected}"
                                 cal:Message.Attach="SelectionChanged($dataContext)]"/>
                    <ComboBox cal:Message.Attach="SelectionChanged($dataContext)]" 
                              ItemsSource="{Binding TestsNamesUnderCategory}" SelectedIndex="{Binding SelectedTestInx, Mode=TwoWay}">
                        <i:Interaction.Behaviors>
                            <local:ComboBoxReSelectionBehavior />
                        </i:Interaction.Behaviors>
                    </ComboBox>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

cal:Message.Attach="SelectionChanged($dataContext)]"是使用Caliburn框架,它只是发送触发器到我的方法。

希望现在更清楚了。谢谢!

如何从附加在其上的行为触发组合框SelectionChanged事件

为什么不将选择绑定到视图模型属性,然后执行所需的任何逻辑?

Xaml:

<...
   <ComboBox ItemsSource={Binding YourSource} SelectedItem={Binding YourSelectedItem}/>
.../>

ViewModel:

private string yourItem; // assuming we are just dealing with strings...
public String YourItem {
   get { return yourItem; }
   set {
          if( String.Equals(yourItem, value, StringComparison.OrdinalIgnoreCase) )
             return;
          OnYourItemChanged(); // Do your logics here
          RaisePropertyChanged("YourItem");
        }
   }
   private void OnYourItemChanged()
   {
       // .. do stuff here 
   }

如果你绝对需要使用事件,请使用event-to-command…

假设您正在使用System.Windows.Interactivity &Galasoft MVVM灯

引用:

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"      
 xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"
Xaml:

<...
   <ComboBox ItemsSource={Binding YourSource} SelectedItem={Binding YourSelectedItem}>
       <i:Interaction.Triggers>
           <i:EventTrigger EventName="SelectionChanged">
               <cmd:EventToCommand Command="{Binding SomeCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
   </ComboBox>
.../>

这将把你的事件连接到一个命令,该命令将在视图模型上使用请求的参数执行。

ViewModel:

 public class YourViewModel : ViewModelBase 
 {
      public ICommand SomeCommand { get; set; }
      public YourViewModel(......)
      {
          SomeCommand = new RelayCommand<SelectionChangedEventArgs>(YourCommandMethod);
      }
      private void YourCommandMethod(SelectionChangedEventArgs e)
      {
          // Do your magic here.... 
      }
 }

注意,我写这篇文章时没有在这台计算机上访问vs…关于如何做到这一点,有很多例子。

如果您只需要触发事件,您可以从DropDownClosed激活的命令调用该方法。