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 のCanExecuteChangedEventManagerクラスページを参照してください。

リンクされたページから...このクラス

「弱いイベント リスナー」パターンを使用して CanExecuteChanged イベントのリスナーをアタッチできるように、WeakEventManager 実装を提供します。

Weak Event Patterns の詳細については、MSDN のWeak Event Patternsページを参照してください。

于 2013-10-15T15:58:36.130 に答える