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 (イベントは 2 回発生します) そして、即時ウィンドウに書き込むsender.GetHashCode()と、最初は現在のウィンドウからコンボボックスのハッシュコードが返され、2 回目は「死んだ」ウィンドウのハッシュコードが返されます。そのため、ウィンドウが表示されるたびにイベントが発生します。古いコンボボックスが破棄されていないようです。私の問題を理解してください。前もって感謝します!

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 に答える