如何从附加在其上的行为触发组合框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框架,它只是发送触发器到我的方法。
希望现在更清楚了。谢谢!
为什么不将选择绑定到视图模型属性,然后执行所需的任何逻辑?
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
激活的命令调用该方法。