Пробую освоить MVVM, дается очень тяжело. В теории вроде понятно, а вот как на практике реализовать, не очень понимаю. Тем более хочу использовать команды. Делаю простое приложение, два окна - одно основное, и второе. На первом расположена кнопка при нажатии на которую необходимо открыть второе окно-форму, в котором заполняются данные (имя и фамилия), при кнопки Ок - записать все в коллекцию (банально в List), как передать данные в список, то же вопрос.
Примерно выглядеть будет так:
Дерево проекта:
Разметка первой вью
Вторая вью
Класс реализующий интерфейс комманд
public class DelegateCommand : ICommand
{
private readonly Action _command;
private readonly Func
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public DelegateCommand(Action command, Func
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
Базовый класс от которого потом наследую 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
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public DelegateCommand(Action command, Func
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
Базовый класс для 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);
}
}
Таким образом при нажатии кнопки, открывается второе окно.
Комментариев нет:
Отправить комментарий