В 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
в примере выше. Служебный метод вызывается в фоновом потоке, чтобы пользовательский интерфейс реагировал.