Właśnie skończyłem aplikacje napisane w WPF i C# przy użyciu wzorca MVVM. W tej aplikacji użyłem implementacji Command Delegate, aby zawinąć właściwości ICommands w moim ModelView. Problem polega na tym, że te polecenia DelegateCommands uniemożliwiają usunięcie widoku ModelView i widoku ze śmieci po zamknięciu widoku. Pozostaje więc żartować, dopóki nie zakończę całej aplikacji. Profiluję aplikację Uważam, że chodzi o delegatecommand, która utrzymuje modelowanie w pamięci. Jak mogę uniknąć tej sytuacji i czy to jest w naturze wzoru mvvm, czy chodzi tu o wszczepienie wzoru ?. Dzięki.Przeciek pamięci w aplikacji WPF z powodu DelegateCommand
Edit: jest mała, ale pełna porcja jak zaimplementować MVVM wzór
pierwsze: klasa 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);
}
}
drugie: ModelView Klasa
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));
}
}
}
trzecie: Kod Okno za
public MainWindow()
{
InitializeComponent();
base.DataContext = new ViewModel();
}
Forth: Mój 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>
Powinieneś naprawdę użyć 'Func