Утечка памяти в приложении WPF из-за DelegateCommand

Я только что закончил настольные приложения, написанные на WPF и c #, используя шаблон MVVM. В этом приложении я использовал реализацию Delegate Command, чтобы обернуть свойства ICommands, представленные в моем ModelView. Проблема в том, что эти DelegateCommands предотвращают сборку мусора для моего ModelView и View после закрытия представления. Таким образом, это остается нерешенным, пока я не завершу все приложение. Я профилирую приложение и считаю, что все дело в делегатской команде, которая хранит представление модели в памяти. Как я мог избежать этой ситуации, и это по своей природе паттерн mvvm, или речь идет о моей имплантации паттерна? Благодарю.

Редактировать: это небольшая, но полная часть того, как я реализую шаблон MVVM

Первый: класс 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);
    }
}

Второе: класс 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));
        }
    }
}

Третье: код окна позади

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

Далее: мой 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>

Ответы на вопрос(3)

Ваш ответ на вопрос