Search code examples
c#wpfmvvmtextbox

Clearing textboxes


I'm making an input page and I'm trying to implement a reset button. After a click on the button, the UI should be empty again.

I thought that entering an empty string would deal with this. In the code it seems to work and the value does get changed to "" but in the UI the typed text stays visible (so it doesn't show the empty "" string). I also tried with string.Empty as suggested in here but that also doesn't seem to work.

Am I missing something here? I'm kinda new to programming so if I did something horribly wrong, don't laugh too hard ;)

I'm using an MVVM pattern and Fody Weaver to deal with the property changed part of the code.

The UI / XAML

<TextBlock Text="Naam:"
           Grid.Column="0"
           Style="{StaticResource InputInputBlock}"
           />

<TextBox Foreground="White"
         Grid.Column="1"
         Text="{Binding Name, Mode=TwoWay}"
         Style="{StaticResource InputInputBox}"
         />

<Button Content="Reset"
            Height="50"
            Width="150"
            Grid.Column="0"
            Grid.Row="2"
            VerticalAlignment="Top"
            HorizontalAlignment="Center"
            Style="{StaticResource FlatButton}"
            Command="{Binding ResetCommand}"
            />

The view model

private string _name;
public string Name
        {
            get => _name;
            set
            {
                _name = value;
            }
        }
public AddStakeholderViewModel()
        {
            ResetCommand = new RelayCommand(() => ResetForm());
        }

private void ResetForm()
        {
            Name = " ";
        }

Solution

  • You can implement the INotifyPropertyChanged interface in your class. This works for me:

    public class Person : INotifyPropertyChanged
        {
            private string _name;
            public string Name
            {
                get { return _name; }
                set
                {
                    _name = value;
                    // Call OnPropertyChanged whenever the property is updated
                    OnPropertyChanged("Name");
                }
            }
    
            // Declare the event
            public event PropertyChangedEventHandler PropertyChanged;
    
            // Create the OnPropertyChanged method to raise the event
            protected void OnPropertyChanged(string name)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
            }
        }
    

    XAML:

    <TextBox Foreground="White"
         Grid.Column="1"
         Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
         Style="{StaticResource InputInputBox}"
         />
    

    MainWindow:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = newPerson;
        }
        Person newPerson = new Person();
        private void button_Click(object sender, RoutedEventArgs e)
        {
            newPerson.Name = "";
        }
    }