WPF窗口事件在窗口关闭后如何继续触发?

4

我有一个关于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(),第一次返回当前窗口中组合框的哈希码,第二次返回“已关闭”的窗口的哈希码。 因此,事件会随着窗口显示的次数而触发多次。看起来旧的组合框没有被处理或类似于那样的东西。 希望您能理解我的问题。 提前致谢!
2个回答

4
原因是你使用了绑定,而且在窗口关闭后仍然有效。然后你在一个窗口中更改选定的项目,通过绑定会更改另一个窗口(已关闭)中的选定项目。要解决这个问题,你应该在关闭的窗口中设置DataContext = null。或者你可以每次使用同一个窗口,只需隐藏它而不关闭。

1
给下拉框命名,并从代码中订阅SelectionChanged事件,而不是在XAML中。在窗口关闭时,取消订阅该事件以确保其被处理。
<ComboBox Name="MyComboBox"....... />

然后在代码中:

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

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

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

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