2013-03-29 147 views
3

我遇到了wpf事件的問題。 在XAML我已經在與SelectionChanged事件組合框:窗口關閉後wpf窗口事件繼續提升

<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

原因是您正在使用綁定,並且它在窗口關閉後仍然工作。然後,您在一個窗口中更改選定項目,它將通過綁定更改其他窗口(關閉)中的選定項目。要解決這個問題,你應該在關閉的窗口中設置DataContext = null。或者您可以每次使用相同的窗口,只是不關閉它,但隱藏。

0

爲組合框命名並從代碼中訂閱SelectionChanged而不是XAML。在窗口關閉時,取消訂閱該活動以確保它已被處置。

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

然後在代碼:

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

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

你創建新的窗口()每次的窗口,或者它是一個單身?請務必以相同的方式退訂您訂閱的所有活動。否則,您關閉的窗口將永遠不會被丟棄。