0

我看到由事件处理程序引起的内存泄漏CanExecuteChanged

public class MyCommand : ICommand
{
  #region ICommand Members

  public virtual bool CanExecute(object parameter)
  {
     return true;
  }

  public event EventHandler CanExecuteChanged;

  protected virtual void OnCanExecuteChanged(EventArgs e)
  {
     if (CanExecuteChanged != null)
        CanExecuteChanged(this, e);
  }

  public void Execute(object parameter)
  {

  }

 #endregion
}

当我运行 ANTS 内存分析器时,它显示CanExecuteChanged绑定到按钮的事件处理程序effectivevalueentry在我的视图模型中有一个。我的视图模型没有被垃圾收集。

XAML

<Button x:Uid="_editButton" x:Name="_editButton"
                            Tag="Edit"
                            Margin="1,1,1,1"
                            DockPanel.Dock="Left"
            Command="{Binding   Path=EditCommand}"
     CommandParameter="{Binding Path=SelectedItems, ElementName=SearchResultGrid}"
                            Content="{DynamicResource icoEdit1512Image}"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Left"
                            Visibility="{Binding Path=NewEditDeleteButtonVisibility}"
                            Localization.Attributes="Tag (Text Modifiable)">
                       <Button.Style>
                          <Style x:Uid="Style_2" TargetType="{x:Type Button}"
                                 BasedOn="{StaticResource dataGridToolBarButtonStyle}">
                             <Style.Triggers>
      <DataTrigger x:Uid="DataTrigger_1" Binding="{Binding ElementName=SearchResultGrid, 
                                                               Path=SelectedItem}"
                                             Value="{x:Null}">
                                   <Setter x:Uid="Setter_3" Property="IsEnabled" Value="False" />
                                </DataTrigger>
                             </Style.Triggers>
                          </Style>
                       </Button.Style>
                    </Button>
4

2 回答 2

0

此问题已在 .NET 4.5 中得到解决。请查看 MSDN 上的CanExecuteChangedEventManagerClass页面以获取更多信息。

从链接页面......这个类

提供 WeakEventManager 实现,以便您可以使用“弱事件侦听器”模式为 CanExecuteChanged 事件附加侦听器。

您可以从 MSDN 上的弱事件模式页面找到有关弱事件模式的更多信息。

于 2013-10-15T15:58:36.130 回答
0

如果您只是始终返回 true,CanExecute您可以执行以下操作:

public event EventHandler CanExecuteChanged { add { } remove { } }

然后处理程序将不会首先被绑定。

当然,当您真正想要更改时,这将不起作用CanExecute。这种情况的解决方案可以在这个 SO question中找到。

于 2013-10-15T15:49:42.550 回答