2013-07-01 26 views
6

Próbuję uzyskać wartość dwóch pudełek Texbox (symuluję okno logowania) po naciśnięciu przycisku. Polecenie przypisane w przycisku uruchamia się poprawnie, ale nie wiem, jak uzyskać wartość pól tekstowych do "logowania".WPF i MVVM: Uzyskaj wartości z pól tekstowych i wyślij je do ViewModel

To mój ViewModel:

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

To jest widok:

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

Jeśli ktoś może pomóc ... będę nieskończenie wdzięczny.

Odpowiedz

12

Zazwyczaj wiążesz właściwości TextBox.Text z właściwościami w swoim ViewModelu. W ten sposób wartości są przechowywane w ViewModelu, a nie w widoku i nie ma "pobierania" wymaganych wartości.

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

Następnie w XAML, można zrobić coś takiego:

<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"/> 

W tym momencie LoginCommand mogą bezpośrednio korzystać z lokalnych właściwości.

+0

Tak dobrze! Dziękuję, działa idealnie! –

+0

Mimo że jest to stary wpis, ale w jaki sposób uzyskać tę samą funkcjonalność, jeśli muszę podać wiele adresów e-mail w polu Pole tekstowe? W polu tekstowym Przypuśćmy, że piszę w ten sposób: "[email protected], defg @ yahoo.com, test @ gmail.com", a następnie w jaki sposób powiązać to z viewmodelem – Debhere

+0

@Nie musisz rozdzielić e-maile za pomocą string.Split lub podobne, aby wyodrębnić je w VM. –