实际状态:我单击登录按钮,视图模型将更改为新视图。
期望状态:我单击登录按钮(LoginViewModel 将 与视图绑定以获取电子邮件和密码,并在服务器中验证用户的真实性,如果正常,请求将收到有关用户的信息作为答案并更改视图)
我所知道的:更改视图,绑定文本框,与服务器通信(处理请求和答案)
我不知道的是:从LoginViewModel发送到GeneralViewModel的答案与有关用户的信息,不知道如何维护PasswordBox而不是TextBox进行绑定。
法典:登录视图
<Grid Margin="0,0,-74.4,-11.8" HorizontalAlignment="Left" Width="800" Height="600" VerticalAlignment="Top">
<TextBox Text = "{Binding Email, Mode = TwoWay}" Style="{DynamicResource MyTextBox}" x:Name="textBoxEmail" VerticalContentAlignment="Bottom" HorizontalContentAlignment="Center" HorizontalAlignment="Center" Width="248" Margin="274,212,278,347" FontFamily="Segoe UI Semibold" />
<Image Source="C:UsersImageslogo.png" x:Name="Logo" HorizontalAlignment="Left" Height="129" Margin="301,63,0,0" VerticalAlignment="Top" Width="151" RenderTransformOrigin="0.5,0.5">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="0.091"/>
<TranslateTransform/>
</TransformGroup>
</Image.RenderTransform>
</Image>
立即注册! 忘记密码?点击这里!
登录视图模型
class LoginViewModel : AViewModel
{
WifiAP wa;
#region fields
private string _email = null;
private TokenRequest tk;
public DelegateCommand LoginCommand { get; set; }
public string Email
{
get
{
return _email;
}
set
{
_email = value;
OnPropertyChanged("Email");
//Here's the magic
LoginCommand.RaiseCanExecuteChanged();
}
}
private string _password = null;
public string Password
{
get
{
return _password;
}
set
{
_password = value;
OnPropertyChanged("Password");
//Here's the magic
LoginCommand.RaiseCanExecuteChanged();
}
}
public string mac;
#endregion
public LoginViewModel()
{
wa = new WifiAP();
LoginCommand = new DelegateCommand(Login, CanLogin);
}
public bool CanLogin()
{
return !string.IsNullOrEmpty(Email);
}
public void Login()
{
//
}
#region auxiliaryMethods
public string getMac()
{
mac = wa.GetMACAddress();
return mac;
}
public string hashingMD5(string pass)
{
string pwd = pass;
System.Security.Cryptography.MD5 hs = System.Security.Cryptography.MD5.Create();
byte[] db = hs.ComputeHash(System.Text.Encoding.UTF8.GetBytes(pwd));
string result = Convert.ToBase64String(db);
return result;
}}
主视图模型
public MainWindowViewModel{
this.AddViewModel(new LoginViewModel() { DisplayName = "Login", InternalName = "LoginViewModel" });
this.AddViewModel(new GeneralViewModel() { DisplayName = "General", InternalName = "GeneralViewModel" });
this.Current_ViewModel = this.GetViewModel("LoginViewModel");
提前感谢您的时间。
首先,这里有一篇文章告诉您在MVVM中处理PasswordBox的内容和方法。其次,如何传递数据?我对MVVM Light不是很熟悉,因为我个人使用PRSIM。不过,您可以执行类似 RegionContext 的操作。
首先,您必须创建一个类作为区域数据。请注意,此模型还实现了 OnPropertyChanged 接口(该实现来自 MVVM Light 中继承的 ViewModelBase)。
public class HaveLoginData : ViewModelBase
{
private string _login;
public string Login
{
get { return _login; }
set
{
_login = value;
RaisePropertyChanged(() => Login);
}
}
}
在构造函数中,您应该为两个视图模型创建此类的公共实例:
public MainWindowViewModel
{
var regionData = new HaveLoginData();
this.AddViewModel(new LoginViewModel() { RegionData = regionData });
this.AddViewModel(new GeneralViewModel() { RegionData = regionData });
this.Current_ViewModel = this.GetViewModel("LoginViewModel");
}
您还必须向 ViewModels 添加一个名为 RegionData 的新属性:
using System.ComponentModel;
namespace YourApp.ViewModels
{
public class GeneralViewModel
{
private HaveLoginData _regionData;
public HaveLoginData RegionData
{
get { return _regionData; }
set
{
_regionData = value;
_regionData.PropertyChanged += _regionData_PropertyChanged;
}
}
private void _regionData_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Login")
{
// do the second view model login logic
}
}
}
}
和登录视图模型:
namespace YourApp.ViewModels
{
public class LoginViewModel
{
public HaveLoginData RegionData { get; set; }
public void Login()
{
// do the login conditions logic
if (true)
{
RegionData.Login = "new user login";
}
}
}
}
如您所见,当有人设置 RegionData 时,您将订阅 PropertyChanged 事件,并在每个 ViewModel 中注意到 Login 和 MD5Password 属性中的更改。如您所见,您还必须记住如何从以前的区域数据中取消订阅 PropertyChanged 事件。创建后的 RegionData 不应更改,因此可能没有必要在资源库中执行此操作(您可以进行某种 Dispose 以删除引用)。