我正在创建我的第一个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),所以它会显示错误消息弹出窗口或重定向到下一个视图?
答案 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
}