wpf窗口事件在窗口关闭后继续引发

标签 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);
  }

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

最佳答案

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

关于wpf窗口事件在窗口关闭后继续引发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15700538/

相关文章:

c# - DP 更改值后启用并聚焦已禁用的控件

wpf - 如何从 XAML 中为样式中的控件指定工具提示?

c# - 如果表单应用程序关闭 C#,如何防止发生 Timer Elapsed 事件

c# - 哪个类在其构造函数中调用 SuppressFinalize 以致于您的 dispose 调用无用?

compact-framework - 如何在 Compact Framework 上处置 Forms.Timer

c# - 使用 ninject 作为 WPF View 模式定位器 - View 模型作为单例

基于文本长度的 WPF 文本框背景颜色

c# - MVVM 中的 WPF 数据网格多选完成事件。如何知道用户何时完成了他的选择?

.net - 返回一个实现 IDisposable 的对象是个好主意吗?

winforms - 我应该处置 HtmlElement 实例吗?