0

我的 AppBar 上有一个“同步所有”按钮。这会为每个提供者调用一个 Web 服务,并更新他们已缓存的数据。更新后,我需要更新屏幕上选定的提供程序数据,那么我该如何使用 mvvm-light 来执行此操作。

1)当我尝试通过单击按钮访问数据时,我不确定如何访问当前加载的视图模型,以便刷新它们后面的数据。有没有办法从点击事件访问视图模型并刷新底层数据。

2)我想知道信使类的用途是什么,如果是这样,当用户单击“全部同步”按钮时,我可以查看任何好的示例来使用此功能。

3)如果信使类不是这样做的方法并且没有办法访问当前的视图模型,我还有什么其他选择。

任何帮助将不胜感激。

4

1 回答 1

1

你有两种方法可以做到这一点:

  1. 使用信使
  2. 使用标准事件

无论您的设计如何,选项 1 都可以正常工作,如下所示:

  1. 用户单击您的 AppBar 按钮,该按钮调用命令
  2. 该命令调用一个服务,该服务在内部调用您的 Web 服务(好方法),或者该命令只调用您的 Web 服务(不太好的方法)。我期待这个方法是一个异步方法。
  3. 一旦你得到你的新数据,你调用 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 服务。该服务将被注入到您的所有视图模型中。

  1. 用户单击您的 AppBar 按钮,该按钮调用命令
  2. 该命令调用一个服务,该服务在内部调用您的 Web 服务(好方法),或者该命令只调用您的 Web 服务(不太好的方法)。我期待这个方法是一个异步方法。
  3. 该服务引发一个标准事件,让订阅的视图模型知道他们需要刷新他们的数据。所以基本上与选项 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。

于 2013-03-04T12:13:50.747 回答