即使窗口已经关闭,也会查询RelayCommand绑定canexecute

时间:2012-12-12 13:15:28

标签: c# wpf c#-4.0

  

可能重复:
  When does the ui detach from commands?

出于测试目的,我创建了包含2个窗口的简单应用程序:

a)MainWindow按钮按以下方式定义:

 <Button Content="Button" HorizontalAlignment="Left" Margin="53,36,0,0" VerticalAlignment="Top" Width="75" Click="HandlerButtonOnClick"/>

然后定义HandlerButtonOnClick

/// <summary>
/// The handler button on click.
/// </summary>     
private void HandlerButtonOnClick(object sender, RoutedEventArgs e)
{
 new WindowWithButton().ShowDialog();
}

b)WindowWithButton是简单的窗口,其中定义了一个按钮:

<Button Content="Button" HorizontalAlignment="Left" Margin="47,47,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=Click, ElementName=clickWindow}"/>

其中clickWindow是窗口的名称。

在第二个窗口中,我有以下列方式定义的命令属性:

/// <summary>
/// The click.
/// </summary>
private ICommand click;

/// <summary>
/// Gets the click.
/// </summary>
public ICommand Click
{
    get
    {
        return this.click ?? (this.click = new RelayCommand(
                                               obj => MessageBox.Show("Click"), 
                                               obj =>
                                                   {
                                                       Debug.WriteLine("Click queried");
                                                       return true;
                                                   }));
    }
}

我的问题如下。我已添加Debug.WriteLine("Click queried");行来检查何时调用它,我意识到它不仅在Focus窗口上调用。即使WindowWithButton已关闭,也会调用它。所以,我按下按钮,然后我关闭WindowWithButton并激活MainWindow并调用CanExecute部分。它永远不会停止调用可以执行。每次我打开窗口,它都会增加另一个执行。因此,当我多次打开窗口时,它将增加执行此代码。即使窗口被卸载,它也不会停止执行。

如何阻止此行为,因为它可能导致应用程序稳定性和内存使用以及性能方面的严重问题。

0 个答案:

没有答案