Управление в MVVM (WPF) - как возвратить значение?

Я использовал шаблон MVVM некоторое время теперь, но я все еще сталкиваюсь с проблемами в реальных ситуациях. Вот другой: Я использую управление и пузырь событие, которое будет обработано в ViewModel.Пока все хорошо. Но проект, для которого я использую MVVM, является на самом деле библиотекой классов. После того как я выполняю код команды, я должен смочь передать объект обратно вызывающему приложению. Что предложенный пути должны сделать так?

Конкретно: В моем приложении вызова мне связали страницу XAML непосредственно к ViewModel библиотеки, который содержит объект "Thing1". Когда кнопка нажата, метод в ViewModel называют (назовите его "CopyThing1 ()"). Это копирует "Thing1" для создания "Thing2". Затем я должен отправить "Thing2" назад в приложение вызова.

Спасибо!!!

9
задан CyberFox 8 February 2017 в 07:55
поделиться

3 ответа

Хотя информация о командах была ясной и правильной, ее нельзя было применить в моем случае, потому что ответ, который должен был произойти, был в вызывающем приложении, НЕ использующем MVVM, и это не должно было быть только откликом пользовательского интерфейса. Я исследовал Prism, но нашел его слишком сложным для того, что мне нужно в данный момент. В конце концов я вызвал и обработал события, как описано здесь -> WPF MVVM Правильный способ инициировать событие при просмотре из ViewModel

1
ответ дан 4 December 2019 в 13:47
поделиться

Если Thing2 является другим свойством вашей модели просмотра, вы можете использовать обычный INotifyPropertyChanged, чтобы сообщить пользовательскому интерфейсу об изменении.

Вы также можете использовать EventAggregator Prism для более независимого подхода

2
ответ дан 4 December 2019 в 13:47
поделиться

Команды не возвращают значения, они изменяют состояние вашего приложения. В случае 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 .

10
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: