Пробую освоить MVVM, дается очень тяжело. В теории вроде понятно, а вот как на практике реализовать, не очень понимаю. Тем более хочу использовать команды. Делаю простое приложение, два окна - одно основное, и второе. На первом расположена кнопка при нажатии на которую необходимо открыть второе окно-форму, в котором заполняются данные (имя и фамилия), при кнопки Ок - записать все в коллекцию (банально в List), как передать данные в список, то же вопрос.
Примерно выглядеть будет так: Дерево проекта: Разметка первой вью
Вторая вью
Класс реализующий интерфейс комманд public class DelegateCommand : ICommand
{
private readonly Action _command;
private readonly Func _canExecute; public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
} public DelegateCommand(Action command, Func canExecute = null)
{
if (command == null)
throw new ArgumentNullException();
_canExecute = canExecute;
_command = command;
} public void Execute(object parameter)
{
_command();
} public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute();
}
}
Класс реализующий INotifyPropertyChanged public abstract class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected virtual void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} protected void SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (!EqualityComparer.Default.Equals(field, value))
{
field = value;
NotifyPropertyChanged(propertyName);
}
}
}
Базовый класс от которого потом наследую ViewModel public class BaseViewModel : NotificationObject //(реализует INotifyPropertyChanged)
{ }
Ну и сами вьюмодели. Вот в них и не знаю, что необходимо делать... public class MainWindowViewModel : BaseViewModel
{ }
public class SecondWindowViewModel : BaseViewModel
{ }
В биндинге пока пусто, так как не понимаю, что туда биндить, какой-то Action.
Еще один вопрос, если использовать в проекте комманды, использовать события компонентов вью это моветон или нормальная практика?
Ответ
Сделал пока без отдельного класса, который предложили в ответах. Позже и его использую. Вот решение в "лоб":
Класс команды: public class DelegateCommand : ICommand
{
private readonly Action _command;
private readonly Func _canExecute; public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
} public DelegateCommand(Action command, Func canExecute = null)
{
if (command == null)
throw new ArgumentNullException();
_canExecute = canExecute;
_command = command;
} public void Execute(object parameter)
{
_command();
} public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute();
}
}
Класс оповещения вью: public abstract class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected virtual void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} protected void SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (!EqualityComparer.Default.Equals(field, value))
{
field = value;
NotifyPropertyChanged(propertyName);
}
}
}
Базовый класс для ViewModel наследуемый от NotificationObject: public class BaseViewModel : NotificationObject
{ }
Класс ViewModel: public class MainWindowViewModel : BaseViewModel
{
private ICommand _toggleSecondViewCommand;
public ICommand ToggleSecondViewCommand
{
get
{
return _toggleSecondViewCommand;
} private set { }
} public MainWindowViewModel()
{
InitializeCommands();
} private void ToggleSecondViewExecute()
{
SecondWindow rg = new SecondWindow();
rg.Show();
} private void InitializeCommands()
{
_toggleSecondViewCommand = new DelegateCommand(ToggleSecondViewExecute);
}
}
Таким образом при нажатии кнопки, открывается второе окно.
Комментариев нет:
Отправить комментарий