Speicherleck in der WPF-App aufgrund von DelegateCommand

Ich habe gerade Desktop-Apps fertiggestellt, die in WPF und C # mit dem MVVM-Muster geschrieben wurden. In dieser App habe ich die Implementierung von Delegate Command verwendet, um die ICommands-Eigenschaften, die in meinem ModelView verfügbar gemacht werden, zu verpacken. Das Problem ist, dass diese DelegateCommands verhindern, dass meine ModelView- und View-Objekte nach dem Schließen der View überflüssig werden. So bleibt es lärmen, bis ich die ganze Anwendung beende. Bei der Profilerstellung der Anwendung dreht sich alles um den Befehl delegieren, mit dem die Modellansicht im Speicher bleibt. Wie könnte ich diese Situation vermeiden, und liegt dies in der Natur des MVVM-Musters, oder handelt es sich um meine Implantation des Musters? Vielen Dank

Edit: Dies ist ein kleiner, aber vollständiger Teil dessen, wie ich MVVM-Muster implementiere.

First: CommandDelegte Klasse

class DelegateCommand:ICommand
{
    private Action<object> execute;
    private Predicate<object> canExcute;
    public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
        {
            throw new ArgumentNullException("execute");
        }
        this.execute = execute;
        this.canExcute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        if (this.canExcute != null)
        {
            return canExcute(parameter);
        }
        return true;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }


    public void Execute(object parameter)
    {
        this.execute(parameter);
    }
}

Second: ModelView-Klasse

public class ViewModel:DependencyObject, INotifyPropertyChanged
{
    private DelegateCommand printCommand;

    public ICommand PrintCommand
    {
        get
        {
            if (printCommand == null)
            {
                printCommand = new DelegateCommand(Print, CanExecutePrint);
            }
            return printCommand;
        }
    }
    void Print(object obj)
    {
        Console.WriteLine("Print Command");

    }
    bool CanExecutePrint(object obj)
    {
        return true;
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void OnProeprtyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Third: Fenstercode hinter

public MainWindow()
    {
        InitializeComponent();
        base.DataContext = new ViewModel();
    }

Forth: Mein XAML

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.InputBindings>
    <KeyBinding Key="P" Modifiers="Control" Command="{Binding Path=PrintCommand}"/>
</Window.InputBindings>
<StackPanel>
    <Button Content="Print - Ctrl+P" Width="75" Height="75" Command="{Binding Path=PrintCommand}"/>
</StackPanel>

Antworten auf die Frage(6)

Ihre Antwort auf die Frage