2017-05-23 1 views
0

Donc, j'ai passé trop de temps à essayer de comprendre ce que je fais de mal. Je suis assez nouveau à Prism aussi. J'ai regardé des exemples contraignants d'autres peuples, mais aucun d'entre eux ne semble fonctionner. Ce qui ne fait pas depuis pour moi est ce que je lie dans le "Text =" et va cliquer sur une autre zone de texte que mon texte efface. J'ai essayé TwoWay Mode, UpdatePropertyChange, etc. Rien ne semble fonctionner. J'ai même mis des points de rupture pour voir si la valeur correspond bien au code cs. Mais non, ça ne lie pas. Qu'est-ce que je fais mal? Je veux juste que ma zone de texte égalise ma valeur de chaîne "UserName" de viewmodels afin que quelqu'un clique sur le bouton de connexion, il vérifie les valeurs pour voir si elles existent dans une base de données.Liaison de problème WpfToolKit Filigrane Textbox utilisant Prism

Voici Login.xaml:

 <Grid x:Name="UserInputGrid" 
      Margin="15" 
      Height="100"> 
     <wpfTool:WatermarkTextBox x:Name="UsernameTextBox" 
            Width="600" 
            Height="100" 
            Text="{Binding UserName}" 
            Watermark="Username" 
            Cursor="IBeam" 
            FontFamily="Quicksand" 
            FontSize="72"/> 
    </Grid> 

LoginView.xaml.cs

public LoginView() 
    { 
     InitializeComponent(); 
     DataContext = new LoginViewModel(); 
    } 
} 

LoginViewModel.cs:

public class LoginViewModel : BindableBase 
{ 
    #region Private Variables 

    //Private Variables 

    bool isCanLogin = true; 
    private string _username; 
    private string _password; 
    #endregion 

    #region Public Variables 

    //Public Variables 

    public string UserName 
    { 
     get { return _username; } 
     set { RaisePropertyChanged("UserName"); } 
    } 
    public string Password 
    { 
     get { return _password; } 
     set { RaisePropertyChanged("Password"); } 
    } 
    public bool CanLogin() { return isCanLogin; } 

    #endregion 

    #region Commands 

    //Commands 

    RelayCommand _loginCommand; 
    public ICommand LoginCommand 
    { 
     get 
     { 
      if (_loginCommand == null) 
       _loginCommand = new RelayCommand(Login, CanLogin); 

      return _loginCommand; 
     } 
    } 
    #endregion 

    #region Functions and Methods 

    //Functions and Methods 

    private void Login() 
    { 
     try 
     { 
      isCanLogin = false; 
      SoundPlayers.ButtonSound(); 
      //Authentication and Checks the DB to see if the User exists 

      if (AuthenticationService.VerifyUser(UserName, Password)) 
      { 
       //Navigate to landing page 
       SoundPlayers.LoginSound(); 
      } 
      else 
      { 
       //Doesn't exist!?! 
      } 

      isCanLogin = true; 
     } 
     catch 
     { 
      //If Login requirements aren't met, or failed 
     } 
     finally 
     { 
      isCanLogin = true; 
     } 
    } 
    #endregion 
} 
+0

* "Ce qui ne me fait pas, c'est ce que je lie dans le" Text = "et je clique sur une autre zone de texte que mon texte efface." * - Dites-vous que vous tapez du texte dans 'UsernameTextBox' , puis quand il perd le focus, il rejette le texte que vous avez tapé dans la boîte? –

+0

Oui, la seule façon de rester est si je fais Mode = OneWay, je regarde un autre exemple, et ils font deux fois. Mais tout ce que je fais, quand je mets mon curseur sur la valeur UserName pour voir si elle a la valeur que j'ai tapé dans la zone de texte, il dit "Null". (C'est quand j'ai mis un point de rupture.) – Hypergyzed

Répondre

2

Changer vos setters de propriété à quelque chose comme ce qui suit:

public string UserName 
{ 
    get { return _username; } 
    set { SetProperty(ref _username, value); } 
} 

Avec cette technique, vous ne devez pas appeler le RaisePropertyChanged, il est fait pour vous. Et, la variable de support est définie si elle a changé.

La méthode SetProperty provient de l'espace de noms Prism.Mvvm.

+0

Cela a fonctionné parfaitement! Merci beaucoup! – Hypergyzed

+0

@jtreimer Vous devez l'accepter comme réponse correcte lorsque le système vous le permet. –

1

Vos setters sont brisés. Ils ne mettent jamais à jour le champ de sauvegarde privé. Le contrôle met correctement à jour votre propriété via la liaison, mais la propriété n'enregistre pas la valeur qui entre. Vous devez également mettre à jour Password.

public string UserName 
{ 
    get { return _username; } 
    set { 
     if (_username != value) 
     { 
      _username = value; 
      RaisePropertyChanged("UserName"); 
     } 
    } 
}