WPF:如何在程序中触发SelectionChangedEvent事件

6
在WPF中,我想在代码中触发ComboBox的SelectionChanged事件。我尝试了以下代码,但没有效果:
 myComboBox.RaiseEvent(new RoutedEventArgs(ComboBox.SelectionChangedEvent,
                                            myComboBox));
               

我该如何触发这个事件?

谢谢


1
为什么你想这样做?可能有更好的方法。 - Rohit Vats
因为组合框的选择没有改变,但我必须执行该处理程序中的代码,因为我改变了另一个控件。 - Tom
3
为什么不将代码提取到某个方法中,然后从两个组合框的selectionChanged事件调用该方法? - Rohit Vats
4个回答

9

尽管其他答案都是好的实践,但它们并没有真正回答你的问题。为了真正回答你的问题,即在程序中自动引发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);

或者,如果你想用一条命令完成:

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

简单易懂。但我同意@RohitVats和@BradleyDotNet的观点,最好创建另一个方法来执行相同的功能,该方法需要传递通常的事件处理程序参数,并从任何其他方法中调用它。

我仍然会将此留在这里,以防其他人不想听取建议。无论如何,了解如何以这种方式引发事件是很好的。


4
你刚刚说你只需要执行处理程序,所以不需要担心引发实际事件。只需调用处理程序(我假设您可以访问它,因为您可以访问组合框本身):
SelectionChangedHandler(myComboBox, new RoutedEventArgs());

现在这有点像黑客手段,你应该将需要重新运行的逻辑重构成一个新函数:

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

private void CommonHandleLogic()
{
   ...Whatever you do
}

然后你只需调用 CommonHandleLogic(),而不是尝试触发事件。

0
这个问题出现在我使用ListBox的时候,可以通过设置SelectedItem索引来解决。例如:
myComboBox.SelectedItem = 0;

0
通过MSDN,如果没有选择任何项,则返回负一(-1)的值。
因此,请为您的组合框设置一个默认索引,而不是-1,
并将索引切换到-1,然后切换回原始索引以调用事件,
而不实际更改索引:
    public static void RaiseSelectionChanged(ComboBox cbx)
    {
        int index = cbx.SelectedIndex;
        cbx.SelectedIndex = -1;
        cbx.SelectedIndex = index;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接