窗口关闭后,wpf窗口事件继续提升

时间:2013-03-29 09:25:00

标签: wpf dispose

我遇到了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(); - &GT; ComboboxSelectedChanged(事件被提出) - &gt;关闭窗口(); 然后再说一遍:Window.ShowDialog(); - &GT; ComboboxSelectedChanged(事件被提升两次) 如果在即时窗口中我写sender.GetHashCode(),它首次从当前窗口返回组合框的哈希码,并在第二次返回'死'窗口的哈希码。 因此,当窗口显示时,事件会被提升很多次。它似乎没有处理旧的组合框或类似的东西。 希望你能理解我的问题。 提前谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

然后在代码中:

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

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

每次都使用新的Window()创建窗口,还是单例?确保以相同的方式取消订阅您订阅的所有活动。否则,您关闭的窗口将永远不会被丢弃。