Pérdida de memoria en la aplicación WPF debido a DelegateCommand

Acabo de terminar las aplicaciones de escritorio escritas en WPF y C # usando el patrón MVVM. En esta aplicación, utilicé la implementación del comando Delegate para ajustar las propiedades de ICommands expuestas en mi ModelView. El problema es que estos DelegateCommands evitan que mi ModelView y View sean recolectados después de cerrar la vista. Por lo tanto, se mantiene larking hasta que finalice toda la aplicación. Realizo un perfil de la aplicación y creo que se trata de delegarcomando que mantener la vista del modelo en la memoria. ¿Cómo podría evitar esta situación y esto es en la naturaleza del patrón mvvm, o se trata de mi implantación del patrón? Gracias.

Editar: esta es una porción pequeña pero completa de cómo implemento el patrón MVVM

Primero: clase CommandDelegte

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);
    }
}

Segundo: clase ModelView

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));
        }
    }
}

Tercero: código de ventana detrás

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

Cuarto: mi 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>

Respuestas a la pregunta(3)

Su respuesta a la pregunta