Что находится вместо контроллера в приложениях WPF - PullRequest
0 голосов
/ 26 февраля 2020

Большинство приложений сегодня являются веб-приложениями. И поэтому большинство руководств и примеров написаны для веб-приложений. Там, где я работаю, мы создаем приложение WPF, и я не могу понять одну вещь:

  • Что находится вместо контроллера в приложении WPF (с использованием шаблона MVVM) ?

Для уточнения:

В веб-приложениях пользовательский интерфейс обычно общается с контроллером по HTTP. Затем контроллер обращается к службам / репозиториям / et c (в зависимости от архитектуры).

Мне еще предстоит увидеть четкий пример связи между пользовательским интерфейсом и серверной частью в приложении WPF.

Примеры, которые я видел, используют либо очень тесную связь (обычно в учебниках), либо HTTP-бэкэнд (что в основном делает его веб-приложением). Итак, если вы хотите получить преимущества слабой связи от архитектуры HTTP, но все это должно быть в одном приложении, как мне этого добиться?

1 Ответ

2 голосов
/ 26 февраля 2020

В MVVM представление связывается с классом модели представления. Класс модели представления может быть дополнен моделями или службами.

Допустим, например, что вы хотите отобразить список некоторых элементов, которые вы получаете от некоторого REST API.

В представлении, вы можете определить ItemsControl, который привязывается к свойству коллекции модели представления:

<ItemsControl ItemsSource="{Binding Items}" />

У вас также может быть кнопка, которая привязывается к команде, отвечающей за выборку данных:

Модель представления может быть реализована примерно так:

public class ViewModel : INotifyPropertyChanged
{
    private readonly IRestService _service;

    public ViewModel(IRestService service)
    {
        _service = service;

        GetDataCommand = new RelayCommand(GetData);
    }

    private IEnumerable<string> _items;
    public IEnumerable<string> Items
    {
        get { return _items; }
        set { _items = value; NotifyPropertyChanged(nameof(Items)); }
    }

    public ICommand GetDataCommand { get; }

    private async void GetData(object _)
    {
        var data = await Task.Run(() => _service.GetData());
        Items = data;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

RelayCommand - это пользовательская реализация интерфейса ICommand, которая выполняет Action<object>. Большинство реализаций, которые вы найдете в сети, не поддерживает async / await, т.е. вы не можете ждать команду. Вот почему GetData возвращает void вместо Task в примере выше. Служебный метод вызывается в фоновом потоке, чтобы пользовательский интерфейс реагировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...