WPF & MVVM: Get values from textboxes and send it to ViewModel
Asked Answered
T

1

10

I'm trying to get the value of two Texboxes (I'm simulating a login window) when I press a button. The command assigned in the button fires correctly, but I don't know how to get the value of the textboxes to do the "login".

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

This is the view:

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

If somebody can help...I'll be infinitely grateful.

Technology answered 1/7, 2013 at 16:11 Comment(0)
P
18

Typically, you'd bind the TextBox.Text properties to properties on your ViewModel. This way, the values are stored within the ViewModel, not the View, and there is no "getting" of the values required.

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

Then, in your XAML, you'd do something like:

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

At this point, the LoginCommand can use the local properties directly.

Protract answered 1/7, 2013 at 16:13 Comment(2)
Although its a old post, but how do i achieve the same functionality if i need to pass multiple email addresses in the Text Box field? In the textBox Suppose I write like this "[email protected], [email protected],[email protected]" then how do i bind that to viewmodelYul
@Yul You'd need to split the emails using string.Split or similar to extract them in the VM.Protract

© 2022 - 2024 — McMap. All rights reserved.