WPF:以编程方式提升SelectionChangedEvent

时间:2014-03-28 16:49:14

标签: c# wpf visual-studio-2010 combobox

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

 myComboBox.RaiseEvent(new RoutedEventArgs(ComboBox.SelectionChangedEvent,
                                            myComboBox));

我如何举起这个活动?

由于

4 个答案:

答案 0 :(得分: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(),而不是尝试举起活动。

答案 1 :(得分:3)

虽然这里的其他答案都是很好的做法,但实际上并没有回答你的问题。要实际回答以编程方式提出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,通过创建另一个采用通常的事件处理程序参数并从任何其他方法调用该方法的方法来做同样的功能会更好。

我仍然会留下这个,以防其他人不想接受这个建议。无论如何,知道如何以这种方式提高事件是很好的。

答案 2 :(得分:0)

在ListBox的上下文中出现了这个问题,可以通过设置SelectedItem索引来解决问题。例如:

myComboBox.SelectedItem = 0;

答案 3 :(得分:0)

MSDN<div id="react"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

所以给你的组合框一个默认索引而不是-1,

并将index切换为-1并返回原始状态以调用事件

没有索引真的改变了:

A value of negative one (-1) is returned if no item is selected.