2013-07-01 6 views
6

Ich versuche, den Wert von zwei Texboxes zu bekommen (ich bin ein Login-Fenster zu simulieren), wenn ich eine Taste drücken. Der in der Schaltfläche zugewiesene Befehl wird korrekt ausgelöst, aber ich weiß nicht, wie der Wert der Textfelder für die "Anmeldung" abgerufen werden soll.WPF & MVVM: Get Werte von Textfeldern und sendet es an Ansichtsmodell

Das ist mein Ansichtsmodell:

class LoginViewModel : BaseViewModel 
{ 
    public LoginViewModel() 
    { 

    } 

    private DelegateCommand loginCommand; 
    public ICommand LoginCommand 
    { 
     get 
     { 
      if (loginCommand == null) 
       loginCommand = new DelegateCommand(new Action(LoginExecuted), 
           new Func<bool>(LoginCanExecute)); 
       return loginCommand; 
      } 
     } 

    public bool LoginCanExecute() 
    { 
     //Basic strings validation... 
     return true; 
    } 
    public void LoginExecuted() 
    { 
     //Do the validation with the Database. 
     System.Windows.MessageBox.Show("OK"); 
    } 
} 

Dies ist die Ansicht:

<Grid DataContext="{StaticResource LoginViewModel}"> 

      <TextBox x:Name="LoginTxtBox" HorizontalAlignment="Left" Height="23" Margin="34,62,0,0" Width="154" /> 
      <PasswordBox x:Name="PasswordTxtBox" HorizontalAlignment="Left" Height="23" Margin="34,104,0,0" Width="154"/> 
      <Button x:Name="btnAccept" 
      HorizontalAlignment="Left" 
      Margin="34,153,0,0" 
      Width="108" 
      Content="{DynamicResource acceptBtn}" Height="31" BorderThickness="3" 
      Command="{Binding LoginCommand}"/> 

Wenn jemand helfen kann ... Ich werde unendlich dankbar.

Antwort

12

Normalerweise würde binden Sie die TextBox.Text Eigenschaften Eigenschaften auf Ihrem Ansichtsmodell. Auf diese Weise werden die Werte im ViewModel und nicht in der View gespeichert, und die erforderlichen Werte werden nicht abgerufen.

class LoginViewModel : BaseViewModel 
{ 
    //... 
    private string userName; 
    public string UserName 
    { 
     get { return this.userName; } 
     set 
     { 
      // Implement with property changed handling for INotifyPropertyChanged 
      if (!string.Equals(this.userName, value)) 
      { 
       this.userName = value; 
       this.RaisePropertyChanged(); // Method to raise the PropertyChanged event in your BaseViewModel class... 
      } 
     } 
    } 

    // Same for Password... 

Dann in XAML, würden Sie so etwas wie tun:

<TextBox Text="{Binding UserName}" HorizontalAlignment="Left" Height="23" Margin="34,62,0,0" Width="154" /> 
<PasswordBox Text="{Binding Password}" HorizontalAlignment="Left" Height="23" Margin="34,104,0,0" Width="154"/> 

An diesem Punkt kann die LoginCommand die lokalen Eigenschaften verwenden, um direkt.

+0

So gut !!! Danke, es funktioniert perfekt! –

+0

Obwohl es ein alter Post ist, aber wie erreiche ich die gleiche Funktionalität, wenn ich mehrere E-Mail-Adressen in das Textfeld eingeben muss? In der TextBox Angenommen, ich schreibe so "[email protected], defg @ yahoo.com, test @ gmail.com", dann wie binde ich das an viewmodel – Debhere

+0

@Debhere Sie müssten die E-Mails mit string.Split teilen oder ähnlich, um sie in der VM zu extrahieren. –