如何从附加到它的行为触发comboBox SelectionChanged事件

时间:2014-07-23 08:47:32

标签: c# wpf mvvm combobox

我有一些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框架,它只是将触发器发送到我的方法。

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

2 个答案:

答案 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激活的命令调用该方法。