Утечка памяти в приложении 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>