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

wyyhbhjk  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(186)

我有一些ComboBox控件,每个控件都有一些值。每个选定的值都会触发一个事件。当从ComboBoxA中选择item时,我的事件将由所选item的值触发。当我的一个组合框刚刚打开和关闭,没有改变它的值,事件是不触发(这是一个组合框的默认行为)。但这不是我需要的。
我所做的是创建一个与DropDownClosed事件关联的行为,但我不知道如何触发SelectionChanged事件。

编辑:

这个问题可以概括为:如何“手动”触发UI控件的事件?或者-是否有方法调用与事件关联的方法?

编辑二:

我将设法把这个问题解释得更清楚些。我有这样的代码,它接受一个项目列表,并将它们作为类别(单选按钮)和类别下的项目(单选按钮内的组合框)。选择项目时-触发选择更改事件。OK!当选择另一个单选按钮时-触发一个事件。OK!!
不起作用的特殊情况(作为ComboBox行为的默认值):当打开一个未被选择的组合,然后关闭它而不改变其选择时-没有事件被触发。但是-这个组合是在一个未选择的类别,我想现在被选中,sincr用户thouched它。我的想法是使用行为(是在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框架,它只是发送触发器到我的方法。
希望现在更清楚了。谢谢你,谢谢

svujldwt

svujldwt1#

为什么不将选择绑定到视图模型属性,然后执行所需的逻辑?
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 
   }


如果你绝对需要使用事件,请使用event-to-command...
假设您使用的是System.Windows.Interactivity和GalasoftMVVMlight
参考文献:

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>
.../>


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

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...关于如何做到这一点,有很多例子。希望对你有帮助。

jobtbby3

jobtbby32#

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

相关问题