WPF:以编程方式提升SelectionChangedEvent

Tom*_*Tom 5 c# wpf combobox visual-studio-2010

在WPF中,我想以编程方式在组合框中引发SelectionChanged事件.我尝试了以下代码,但它不起作用:

 myComboBox.RaiseEvent(new RoutedEventArgs(ComboBox.SelectionChangedEvent,
                                            myComboBox));
Run Code Online (Sandbox Code Playgroud)

我怎么能举起这个活动?

谢谢

Mel*_*viz 8

虽然这里的其他答案是很好的做法,但它们实际上并没有回答您的问题。要实际回答以编程方式引发 SelectionChangedEvent 的问题,您可以执行以下操作:

RoutedEvent routed = ComboBox.SelectionChangedEvent;
List<ComboBoxItem> remove = new List<ComboBoxItem> {myComboBox.Items[0] as ComboBoxItem},
                   add = new List<ComboBoxItem> {myComboBox.SelectedItem as ComboBoxItem};
var e = new SelectionChangedEventArgs(routed, remove, add);
myComboBox.RaiseEvent(e);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在单个命令中执行此操作:

myComboBox.RaiseEvent(new SelectionChangedEventArgs(
    ComboBox.SelectionChangedEvent,
    new List<ComboBoxIem> {myComboBox.Items[0] as ComboBoxItem},
    new List<ComboBoxItem> {myComboBox.SelectedItem as ComboBoxItem}));`
Run Code Online (Sandbox Code Playgroud)

非常简单。但我同意 @RohitVats 和 @BradleyDotNet 的观点,即通过创建另一种方法来执行相同的功能会更好,该方法采用通常的事件处理程序参数并从任何其他方法调用它。

如果其他人不想接受这个建议,我仍然会留在这里。无论如何,知道如何以这种方式引发事件是件好事。


Bra*_*NET 4

您刚刚说过您只需要执行处理程序,因此您无需担心引发实际事件。只需调用处理程序(我假设您可以访问该处理程序,因为您可以访问组合框本身):

SelectionChangedHandler(myComboBox, new RoutedEventArgs());
Run Code Online (Sandbox Code Playgroud)

现在这有点像黑客,你应该真正重构需要重新运行到新函数中的逻辑:

private void SelectionChangedHandler(object sender, RoutedEventArgs e)
{
    ...Stuff that you don't rerun
    CommonHandleLogic();
}

private void CommonHandleLogic()
{
   ...Whatever you do
}
Run Code Online (Sandbox Code Playgroud)

然后您可以直接调用CommonHandleLogic()而不是尝试引发事件。