经过一些研究,我还没有找到使视图模型数据按时失效和重新加载的解决方案。
想象一下一个具有视图模型的应用程序,该应用程序在初始化时会充满来自服务器的数据,并在一段时间(例如1分钟)后使该数据无效并再次从服务器重新加载。
正如我所假设的那样,在视图模型本身中创建调度程序计时器不是一个好主意,因为在我看来,视图模型应该负责这种事情是不对的。
在this中,视频作者演示了如何在视图模型中创建调度程序计时器,以在一段时间后更新某些数据。那是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));
}
// ...
}
在视图模型中实际使用调度程序是否正常,或者有更好的解决方案?