通过viewmodel将webservices结果发送到视图

时间:2013-11-13 16:16:42

标签: web-services xaml mvvm windows-phone-8 command

我正在创建我的第一个Windows Phone 8应用程序并且我想登录所以我创建了一个LoginModel,其中包含LoginModel而不是我的MainPage.xaml我使用LoginViewModel中的命令绑定登录按钮,其中webservice调用发生像此

public class LoginDataViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    private LoginDataINPC _loginDataData { get; set; }

    private string _username {get;set; }
    private string _password { get; set; }

    private ICommand _loginCommand;

    public LoginDataViewModel()
    {
        this._loginCommand = new DelegateCommand(this.LoginAction);
        _loginDataData = new LoginDataINPC();
    }

    public ICommand LoginCommand 
    {
        get 
        {
            return this._loginCommand;
        }
    }

    public LoginDataINPC DataSource 
    {
        get { return _loginDataData; }
        set 
        { 
            _loginDataData = value;
        }
    }

    private void LoginAction(object p)
    {
        AuthenticateUsernamePasswordRequest request = new AuthenticateUsernamePasswordRequest();

        request.UserName = _loginDataData.UserName;
        request.Password = _loginDataData.Password;

        CompanyUIServiceClient client = new CompanyUIService.CompanyUIServiceClient();

        client.AuthenticateUsernamePasswordCompleted += client_AuthenticateUsernamePasswordCompleted;
        client.AuthenticateUsernamePasswordAsync(request);

    }

    void client_AuthenticateUsernamePasswordCompleted(object sender, CompanyUIService.AuthenticateUsernamePasswordCompletedEventArgs e)
    {
        if (e.Result != null)
        {
            CompanyUIService.AuthenticateUsernamePasswordResponse response = new AuthenticateUsernamePasswordResponse();
            try
            {
                response = e.Result;

            }
            catch (Exception ex)
            {
                response = null;
            }

        }
        else
        {
            CompanyUIService.AuthenticateUsernamePasswordResponse response = null;
        }


    }

我正在调试这个并且webservice调用正在运行,但我的问题是如何将结果发送到视图(MainPage.xaml),所以它会显示错误消息弹出窗口或重定向到下一个视图?

1 个答案:

答案 0 :(得分:0)

在MVVM中,ViewModel不应直接与View通信。 ViewModel不应该知道该视图。 ViewModel可以做的是向任何感兴趣的人发送消息。 View可以订阅这些消息并对它们做出反应。在我的例子中,我正在使用MVVM Light。这是一个非常轻量级的类库,就像一个魅力。

您需要做的是定义ViewModel将发送的消息。类似的东西:

public class LoginMessage 
{
  public CompanyUIService.AuthenticateUsernamePasswordResponse Response { get; set; }
}

您的ViewModel可以像这样广播此消息:

void client_AuthenticateUsernamePasswordCompleted(
  object sender, 
  CompanyUIService.AuthenticateUsernamePasswordCompletedEventArgs e)
{
  // your code here
  var message = new LoginMessage { Response = response };
  Messenger.Default.Send<LoginMessage>( message );
}

在您的视图中,您可以订阅构造函数中的消息或Load事件,如下所示:

Messenger.Default.Register<LoginMessage>( 
  this, 
  ( action ) => HandleLoginMessage( action ) );

在HandleLoginMessage中,您可以做任何您想做的事情:

private object HandleLoginMessage( LoginMessage message )
{
  // do whatever you like
}