После небольшого исследования я не нашел решения, позволяющего аннулировать и повторно загружать данные моделей представления вовремя.
Представьте себе приложение с моделью представления, которое при инициализации заполняется данными с сервера,и через некоторое время (скажем, через 1 минуту) эти данные становятся недействительными и снова загружаются с сервера.
Как я полагаю, создание таймера диспетчера в самой модели представления не является хорошей идеей, посколькумне не кажется правильным, что модель представления должна отвечать за подобные вещи.
В этот автор видео демонстрирует создание таймера диспетчера в модели представления для обновления некоторых данных после периодавремени.Это VB.NET, но это выглядит очень похоже на то, что я пытаюсь достичь.
Как я сейчас вижу, используя диспетчер в модели представления:
// ...
public class Foo
{
public string Bar { get; set; }
public int Baz { get; set; }
// ...
}
// ...
public interface IDataService
{
Task<Foo> GetDataAsync();
}
public class FooViewModel : INotifyPropertyChanged
{
private string _bar;
public string Bar
{
get
{
return _bar;
}
set
{
_bar = value;
OnPropertyChanged(nameof(Bar));
}
}
private int _baz;
public int Baz
{
get
{
return _baz;
}
set
{
_baz = value;
OnPropertyChanged(nameof(Baz));
}
}
IDataService service;
DispatcherTimer dispatcherTimer;
private async void dispatcherTimer_Tick(object sender, EventArgs eventArgs)
{
await InvalidateAndReloadDataAsync();
}
private void InitializeDispatcher()
{
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 1, 0);
dispatcherTimer.Start();
}
public async Task InvalidateAndReloadDataAsync()
{
Foo foo = await service.GetDataAsync();
Bar = foo.Bar;
Baz = foo.Baz;
}
public FooViewModel(IDataService dataService)
{
service = dataService;
InitializeDispatcher();
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName()] string name = null)
{
if (name != null) PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
// ...
}
нормально использовать диспетчер в модели представления или есть гораздо лучшее решение?