【问题标题】:Send webservices result to the view through the viewmodel通过 viewmodel 将 webservices 结果发送到视图
【发布时间】:2013-11-26 08:31:21
【问题描述】:

我正在创建我的第一个 windows phone 8 应用程序并且我想登录,所以我创建了一个带有 LoginModel 的 LoginViewModel,而不是在我的 MainPage.xaml 我将登录按钮与 LoginViewModel 中的命令绑定,其中 web 服务调用发生如下这个

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;
        }


    }

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

【问题讨论】:

  • 您是如何触发 LoginCommand 或以其他方式将 VM 绑定到视图的?
  • 需要将VM中的响应与View绑定

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


【解决方案1】:

在 MVVM 中,ViewModel 不应直接与 View 通信。 ViewModel 不应该知道视图。 ViewModel 可以做的是将消息发送给任何感兴趣的人。视图可以订阅这些消息并对它们做出反应。在我的示例中,我使用的是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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多