none
Блокирование кнопки «Отправить» до тех пор, пока все поля формы ввода в WPF не будут заполнены RRS feed

  • Вопрос

  • Дано:
    WPF 4.0 настольное приложение. Обычная форма ввода данных с двумя текстовыми полями ввода и кнопкой «Отправить».

    XAML-код:

    <Label Content="Username" />
    	<TextBox x:Name="Form_UserName" />
    
    <Label Content="Password" />
    	<TextBox x:Name="Form_Password" />
    
    <Button x:Name="Submit"
    	Click="Form_Submit_Button_Click"
    	Content="Submit" />
    

    Задача:
    Реализовать логику, по которой кнопка «отправить» будет включена/активна тогда и только тогда, когда оба поля ввода заполнены.

    Классический способ решения данной задачи — использование обработчиков событий на подобии onLostFocus() или что-то в этом роде, когда мы можем контролировать состояние поля ввода в любой момент, когда пользователь перключил фокус с/на поле ввода.

    Однако, поскольку мой проект написан на WPF, то хотелось бы использовать естественный способ работы с формами в среде WPF — механизм привязки данных (DataBinding). Я прочитал несколько статей на MSDN по теме првоерки данных, но в большинстве из них предлагается использовать MVVM framework, а я хотлбы обойтись без нее.

    Также я попытался поиграть с IMultiValueConverter, но работающего результата так и не было получено.

    Пожалуйста, подскажите как решить данную проблему с помощью привязки данных и наиболее простым способом (я только начинаю осваивать WPF).

    Спасибо.
    8 января 2011 г. 19:58

Ответы

  • Попробуйте вот это.

    XAML:

    <Label Content="Username" />
    <TextBox x:Name="Form_UserName" Text="{Binding Username, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    
    <Label Content="Password" />
    <TextBox x:Name="Form_Password" Text="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    
    <Button x:Name="Submit"	Content="Submit" IsEnabled="{Binding SubmitEnabled}" />
    

    Code-behind:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
      private string username;
      private string password;
        
      public MainWindow()
      {
        InitializeComponent();
        this.username = String.Empty;
        this.password = String.Empty;
        DataContext = this;
      }
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      public string Username
      {
        get
        {
          return username;
        }
        set
        {
          username = value;
          OnPropertyChanged("Username");
          OnPropertyChanged("SubmitEnabled");
        }
      }
    
      public string Password
      {
        get
        {
          return password;
        }
        set
        {
          password = value;
          OnPropertyChanged("Password");
          OnPropertyChanged("SubmitEnabled");
        }
      }
    
      public bool SubmitEnabled
      {
        get
        {
          return !String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password);
        }
      }
    
      private void OnPropertyChanged(string propertyName)
      {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
          handler(this, new PropertyChangedEventArgs(propertyName));
      }
    }
    
    Если все же решите использовать MVVM (не обязательно какой-либо фреймворк), то рекомендую вместо обработчика события нажатия на кнопку использовать команду.

    • Предложено в качестве ответа Abolmasov Dmitry 12 января 2011 г. 23:46
    • Помечено в качестве ответа Abolmasov Dmitry 16 января 2011 г. 20:16
    12 января 2011 г. 10:00