2016-04-27 19 views
2

Aktueller Status: Ich klicke auf den Login Button und das ViewModel wechselt in die neue Ansicht.MVVM - Binden und Ändern

Wunschzustand: Ich klicke auf das LoginButton (das LoginViewModel bindet das mit der Ansicht, um die E-Mail und das Passwort zu erhalten und überprüft auf dem Server die Authentizität des Benutzers und wenn es in Ordnung ist, erhält die Anfrage als Antwort die Info über den Benutzer und ändert sich die Ansicht)

Was ich weiß: die Ansichten der Textbox, die Kommunikation mit dem Server (Umgang mit der Anforderung und die Antworten ändern, binden)

Was ich weiß nicht: von der LoginViewModel zum GeneralViewModel senden Die Antwort mit der Info über den Benutzer, weiß nicht, wie man die PasswordBox anstelle der TextBox zum Binden erhält.

Code: Loginview

<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:\Users\Images\logo.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> 

Registrieren Sie sich jetzt! Passwort vergessen? Klick hier!

LoginViewModel

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

MainViewModel

public MainWindowViewModel{ 
this.AddViewModel(new LoginViewModel() { DisplayName = "Login", InternalName = "LoginViewModel" }); 
this.AddViewModel(new GeneralViewModel() { DisplayName = "General", InternalName = "GeneralViewModel" }); 
this.Current_ViewModel = this.GetViewModel("LoginViewModel"); 

Vielen Dank im Voraus für Ihre Zeit.

+0

Ich denke du machst es dir ein bisschen schwer.Es wäre einfacher, wenn Sie BindableBase als Basisklasse für Ihre ViewModels und RegionManager mit RequestNavigate (Ziel, Parameter) -Methode für die gesamte Navigation verwenden würden. Sie können alles erhalten, indem Sie das NuGet-Paket Prism.Core installieren. Können Sie bitte den Inhalt der Login-Methode angeben? Wie ändern Sie die Ansichten ohne RegionManager? – mikes

+0

Hallo @Mikes danke für Ihre Zeit. Ich habe das MVVM Light installiert und verwende ein paar Sachen, aber ich lerne immer noch diese neue Architektur und es ist immer noch ein Chaos in meinem Gehirn die Konzepte. Und ich mähe im Stackoverflow und versuche einige Konzepte zu verstehen, aber ich habe eine Menge Ärger. Um Ihre erste Frage zu beantworten, habe ich die E-Mail und das Passwort. – Antoine

+0

Ich würde gerne wissen, wie Sie die Ansicht nach dem Aufruf der Login-Methode in Ihrer LoginViewModel-Klasse ändern werden. – mikes

Antwort

0

Zuerst, here you have the article, die Ihnen sagt, was und wie mit PasswordBox in MVVM umzugehen. Zweitens, wie man die Daten weitergibt? Ich kenne MVVM Light nicht sehr gut, weil ich persönlich PRSIM verwende. Sie können jedoch etwas wie RegionContext tun.

Zuerst müssen Sie eine Klasse als Ihre RegionData erstellen. Beachten Sie, dass dieses Modell auch die OnPropertyChanged-Schnittstelle implementiert (die Implementierung kommt von der geerbten ViewModelBase in MVVM Light).

public class HaveLoginData : ViewModelBase 
{ 
    private string _login; 
    public string Login 
    { 
     get { return _login; } 
     set 
     { 
      _login = value; 
      RaisePropertyChanged(() => Login); 
     } 
    } 
} 

als im Konstruktor sollten Sie eine gemeinsame Instanz dieser Klasse für beide Ihre Viewmodel machen:

public MainWindowViewModel 
    { 
     var regionData = new HaveLoginData(); 
     this.AddViewModel(new LoginViewModel() { RegionData = regionData }); 
     this.AddViewModel(new GeneralViewModel() { RegionData = regionData }); 
     this.Current_ViewModel = this.GetViewModel("LoginViewModel"); 
    } 

Sie werden auch eine neue Eigenschaft zu Ihrem Viewmodel genannt RegionData hinzufügen:

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

und die Anmeldung Ansichtsmodell:

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

Wie Sie sehen, wenn jemand die RegionData setzt, abonnieren Sie das PropertyChanged-Ereignis und werden in jedem ViewModel über die Änderungen in den Eigenschaften Login und MD5Password informiert. Wie Sie sehen, müssen Sie sich auch daran erinnern, dass Sie das PropertyChanged-Ereignis von Ihren vorherigen RegionData abbestellen. Die einmal erstellten RegionData sollten nicht geändert werden, daher ist es möglicherweise nicht notwendig, dies im Setter zu tun (Sie können eine Art Dispose machen, um die Referenz zu löschen).

+0

Hallo, ich habe das versucht, aber nicht verwalten, um es zu arbeiten: x – Antoine

+0

Die OnRegionDataChanged-Methode wird nicht aufgerufen? Haben Sie Ihre LoginViewModel Code irgendwo kann ich es sehen? – mikes

+0

Ich möchte dieses Verhalten .. http://i.imgur.com/qwKdh1T.png – Antoine