3

我对 wpf 事件有疑问。在 xaml 中,我有以下带有 selectionchanged 事件的组合框:

<ComboBox Grid.Column="1" Grid.Row="1" Name ="comboBox"
          SelectedItem="{Binding CurrentEventBinding.ControlId, ValidatesOnDataErrors=True}"
          ItemsSource="{Binding ControlsNames}" SelectionChanged="ComboboxSelectionChanged">

在代码隐藏中,我有以下代码:

private void ComboboxSelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
      (DataContext as EventBindingEditViewModel).VmCommands.UpdateSourceCommand.Execute(null);
  }

我有以下工作场景: Window.ShowDialog(); -> ComboboxSelectedChanged(引发事件)-> CloseWindow(); 再说一遍:Window.ShowDialog(); -> ComboboxSelectedChanged(事件被引发两次)如果在即时窗口中我写sender.GetHashCode()它第一次从当前窗口返回组合框的哈希码,第二次返回“死”窗口的哈希码。因此,在显示窗口时,该事件被多次引发。看起来旧的组合框没有被处理或类似的东西。希望你能理解我的问题。提前致谢!

4

2 回答 2

3

原因是您正在使用绑定,并且在关闭窗口后它仍在工作。然后您在一个窗口中更改所选项目,它正在通过绑定更改另一个窗口(已关闭)中的所选项目。要解决此问题,您应该在关闭的窗口中设置 DataContext = null。或者你可以每次都使用同一个窗口,只是不关闭它,而是隐藏它。

于 2013-03-29T10:29:58.213 回答
0

为组合框命名并从代码而不是 XAML 订阅 SelectionChanged。在窗口关闭时,取消订阅该事件以确保它得到处理。

<ComboBox Name="MyComboBox"....... />

然后在代码中:

protected override void OnSourceInitialized(EventArgs e)
{
    MyComboBox.SelectionChanged += ComboBoxSelectionChanged;
}

protected override void OnClosing(CancelEventArgs e)
{
    MyComboBox.SelectionChanged -= ComboBoxSelectionChanged;
}

您是每次都使用 new Window() 创建窗口,还是单例?确保以相同的方式从您订阅的所有事件中取消订阅。否则,您关闭的窗口将永远不会被释放。

于 2013-03-29T10:58:43.553 回答