我有一些ComboBox
个控件,每个控件都有一些值。每个选定的值都会触发我的一个事件。
从ComboBoxA中选择项目时,将使用所选项目的值触发我的事件。
当我的一个组合框刚刚打开和关闭时,没有更改任何值,事件不会被触发(这是组合框的默认行为)。
但这不是我需要的。
我所做的是创建一个与DropDownClosed
事件相关联的行为,但我不知道如何触发SelectionChanged
事件。
修改
这个问题可以概括为: 如何手动'触发UI控件的事件? 或者 - 有没有办法调用与事件相关的方法?
编辑2:
我会尝试更清楚地解释问题。我有这个代码,它接受一个项目列表,并将它们显示为类别(单选按钮)和类别下的项目(RadioButton中的ComboBox)。 选择项目时 - 触发选择更改事件。好! 选择另一个单选按钮时 - 触发事件。行!!
不起作用的特殊情况(作为ComboBox行为的默认设置):打开未选择的组合之一而不关闭它而不更改其选择时 - 不会触发任何事件。但是 - 这个组合在一个未选择的类别下,我现在想要被选中,sincr用户需要它。我的想法是使用行为(在xaml代码中,但到目前为止还没有工作......)
代码(或多或少......):
<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框架,它只是将触发器发送到我的方法。
希望现在更清楚了。谢谢!
答案 0 :(得分:2)
为什么不只是将选择绑定到viewmodels属性,然后执行那里所需的逻辑?
的Xaml:
<...
<ComboBox ItemsSource={Binding YourSource} SelectedItem={Binding YourSelectedItem}/>
.../>
视图模型:
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
}
如果你绝对需要使用事件,请使用事件到命令......
假设您正在使用System.Windows.Interactivity&amp; 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的情况下写了这个...有很多关于如何执行此操作的示例。希望它有所帮助。
答案 1 :(得分:1)
如果您只需要触发事件,可以从DropDownClosed激活的命令调用该方法。