Я пытаюсь написать экран MVVM для приложения WPF, используя async & ждут ключевые слова для написания асинхронных методов для 1. Первоначально загружая данные, 2. Обновляя данные, 3. Сохраняя изменения и затем освежает. Хотя у меня это работает, код очень грязный, и я не могу не думать о том, что должна быть лучшая реализация. Может ли кто-нибудь посоветоваться о более простой реализации?MVVM async wait pattern
Это сокращенная версия моего ViewModel:
public class ScenariosViewModel : BindableBase
{
public ScenariosViewModel()
{
SaveCommand = new DelegateCommand(async() => await SaveAsync());
RefreshCommand = new DelegateCommand(async() => await LoadDataAsync());
}
public async Task LoadDataAsync()
{
IsLoading = true; //synchronously set the busy indicator flag
await Task.Run(() => Scenarios = _service.AllScenarios())
.ContinueWith(t =>
{
IsLoading = false;
if (t.Exception != null)
{
throw t.Exception; //Allow exception to be caught on Application_UnhandledException
}
});
}
public ICommand SaveCommand { get; set; }
private async Task SaveAsync()
{
IsLoading = true; //synchronously set the busy indicator flag
await Task.Run(() =>
{
_service.Save(_selectedScenario);
LoadDataAsync(); // here we get compiler warnings because not called with await
}).ContinueWith(t =>
{
if (t.Exception != null)
{
throw t.Exception;
}
});
}
}
IsLoading подвергается воздействию зрения, где он связан с оживленным индикатором.
LoadDataAsync вызывается каркасом навигации при первом просмотре экрана или при нажатии кнопки обновления. Этот метод должен синхронно устанавливать IsLoading, а затем возвращать управление в поток пользовательского интерфейса, пока служба не вернет данные. Наконец, бросая любые исключения, чтобы их можно было поймать глобальным обработчиком исключений (не обсуждать!).
SaveAync вызывается кнопкой, передавая обновленные значения из формы в службу. Он должен синхронно устанавливать IsLoading, асинхронно вызывать метод Save в службе и затем запускать обновление.
Вы проверили это? https://msdn.microsoft.com/en-us/magazine/dn605875.aspx. – sam
Да, это отличная статья. Я не уверен, что мне нравится привязываться к Something.Result, хотя, чувствую, что ViewModel должен сделать его состояние более очевидным, чем это. – waxingsatirical
Просто идея попробовать ... Сделать стандартное свойство getter и в ожидании чего-то. Привязать с помощью IsAsync = true. – sam