ViewModel和Model之间使用MVVM-Light消息传递进行异步通信?

时间:2011-01-18 15:12:58

标签: windows-phone-7 mvvm-light

我开始为WP7编写一个涉及通过HTTPWebRequest检索数据的应用程序,我试图找到在异步请求返回数据后将数据恢复到ViewModel的最佳方法。

模型和ViewModel在它们自己的命名空间中被拆分成单独的项目,所以我不确定MVVM-Light是否可以以这种方式工作。或者我应该只使用轻量级IoC实现和委托/事件,一旦模型中的调用返回,就调用回ViewModel?

2 个答案:

答案 0 :(得分:1)

尝试使用大小:http://amazedsaint.blogspot.com/2010/10/asynchronous-delegate-command-for-your.html。非常适合测试,因为您的方法都不需要异步,您只需执行Async Command。

我稍微编辑了它以扩展DelegateCommand所以我可以调用RaiseCanExecuteChanged()方法,如下所示:

public class AsyncDelegateCommand : DelegateCommand, ICommand
{

    BackgroundWorker _worker = new BackgroundWorker();
    Func<bool> _canExecute;

    /// <summary>
    /// The constructor
    /// </summary>
    /// <param name="action">The action to be executed</param>
    /// <param name="canExecute">Will be used to determine if the action can be executed</param>
    /// <param name="completed">Will be invoked when the action is completed</param>
    /// <param name="error">Will be invoked if the action throws an error</param>
    public AsyncDelegateCommand(Action action,
                                Func<bool> canExecute = null,
                                Action<object> completed = null,
                                Action<Exception> error = null
                                ) : base(action, canExecute)
    {
    ...
    }
}

希望有帮助。

答案 1 :(得分:0)

您确定在正确的位置提出请求吗?通常,模型只包含您要存储/传输的数据,而视图模型将处理转换该模型的属性,以便View可以显示(或编辑)该模型。我认为Model对象就是你要从HttpWebRequest返回的东西,所以你可能想考虑使用Service类来处理检索数据,虽然这可能对你的应用程序来说太过分了。

无论哪种方式,我都非常建议您在同一个地方处理请求和解析响应;否则你将逻辑分散到多个地方,这会让人感到困惑和难以维护。

如果你需要一些帮助理解MVVM,这里有一些你可以找到帮助的资源