Я использовал шаблон MVVM некоторое время теперь, но я все еще сталкиваюсь с проблемами в реальных ситуациях. Вот другой: Я использую управление и пузырь событие, которое будет обработано в ViewModel.Пока все хорошо. Но проект, для которого я использую MVVM, является на самом деле библиотекой классов. После того как я выполняю код команды, я должен смочь передать объект обратно вызывающему приложению. Что предложенный пути должны сделать так?
Конкретно: В моем приложении вызова мне связали страницу XAML непосредственно к ViewModel библиотеки, который содержит объект "Thing1". Когда кнопка нажата, метод в ViewModel называют (назовите его "CopyThing1 ()"). Это копирует "Thing1" для создания "Thing2". Затем я должен отправить "Thing2" назад в приложение вызова.
Спасибо!!!
Хотя информация о командах была ясной и правильной, ее нельзя было применить в моем случае, потому что ответ, который должен был произойти, был в вызывающем приложении, НЕ использующем MVVM, и это не должно было быть только откликом пользовательского интерфейса. Я исследовал Prism, но нашел его слишком сложным для того, что мне нужно в данный момент. В конце концов я вызвал и обработал события, как описано здесь -> WPF MVVM Правильный способ инициировать событие при просмотре из ViewModel
Если Thing2 является другим свойством вашей модели просмотра, вы можете использовать обычный INotifyPropertyChanged, чтобы сообщить пользовательскому интерфейсу об изменении.
Вы также можете использовать EventAggregator
Prism для более независимого подхода
Команды не возвращают значения, они изменяют состояние вашего приложения. В случае ICommands, прикрепленных к ViewModels, это довольно просто, потому что вы можете сделать это, просто изменив ViewModel при выполнении команды.
Использование RelayCommand из Превосходная статья Джоша Смита о MVVM :
public class MyViewModel : INotifyPropertyChanged
{
private readonly ICommand mutateCommand;
private Thing thing;
public MyViewModel()
{
this.mutateCommand = new RelayCommand(this.Mutate);
}
public ICommand MutateCommand
{
get { return this.mutateCommand; }
}
public Thing Thing
{
get { return this.thing; }
set
{
this.thing = value;
// raise PropertyChanged event here...
}
}
private void Mutate(object parameter)
{
this.Thing = new Thing();
}
}
После вызова myVM.MutateCommand.Execute (новый объект ());
вы можете получить доступ к новому значению myVM.Thing
.