MVVM - 绑定和更改



实际状态:我单击登录按钮,视图模型将更改为新视图。

期望状态:我单击登录按钮(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 以删除引用)。

相关内容

  • 没有找到相关文章

最新更新