你有两种方法可以做到这一点:
- 使用信使
- 使用标准事件
无论您的设计如何,选项 1 都可以正常工作,如下所示:
- 用户单击您的 AppBar 按钮,该按钮调用命令
- 该命令调用一个服务,该服务在内部调用您的 Web 服务(好方法),或者该命令只调用您的 Web 服务(不太好的方法)。我期待这个方法是一个异步方法。
- 一旦你得到你的新数据,你调用 Messenger.Default.Send() 向所有正在监听的视图模型广播他们应该刷新他们的数据。
代码:
视图模型:
public class ViewModel
{
public ViewModel()
{
Messenger.Default.Register<DataRefreshEvent>(this,ReceiveDataRefreshEvent);
}
private void ReceiveDataRefreshEvent(DataRefreshEvent obj)
{
//do what you need to do
}
}
服务:
public class Service
{
public async void RefreshData()
{
await _webService.RefreshDataAsync();
Messenger.Default.Send(new ReceiveDataRefreshEvent());
}
}
选项 2 与选项 1 类似,只是它希望您有一个中央数据服务来包装您的 web 服务。该服务将被注入到您的所有视图模型中。
- 用户单击您的 AppBar 按钮,该按钮调用命令
- 该命令调用一个服务,该服务在内部调用您的 Web 服务(好方法),或者该命令只调用您的 Web 服务(不太好的方法)。我期待这个方法是一个异步方法。
- 该服务引发一个标准事件,让订阅的视图模型知道他们需要刷新他们的数据。所以基本上与选项 1 相同,只是每个视图模型都是活动的,订阅服务上的事件而不是消息传递事件。
代码:
视图模型:
public class ViewModel
{
public ViewModel(IService service)
{
service.DataChanged+=ReceiveDataRefreshedEvent;
}
private void ReceiveDataRefreshEvent(sender obj,EventArgs args)
{
//do what you need to do
}
}
服务:
public class Service:IService
{
public event EventHandler ReceiveDataRefreshedEvent;
public async void RefreshData()
{
await _webService.RefreshDataAsync();
if(ReceiveDataRefreshedEvent!=null)
ReceiveDataRefreshedEvent(this,EventArgs.Empty);
}
}
选项 1 很好,因为您不必将对服务的引用移交给 ViewModel。它很好地解耦。
如果您不确定消息传递使用选项 2。