Проверка формы отключить кнопку отправки, пока все поля не будут заполнены в WPF - PullRequest
4 голосов
/ 08 января 2011

Принимая во внимание: WPF 4.0 настольное приложение. Основная форма ввода с двумя TextBox полями и кнопкой отправки.

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

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

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

Но так как мой проект основан на WPF, я предпочитаю использовать собственный способ работы с формами - механизм привязки данных. Я читал некоторые статьи с этого сайта и MSDN, также о проверке формы, но почти во всех примерах предлагается использовать инфраструктуру MVVM, и я хотел бы реализовать ее без какой-либо платформы.

Кроме того, я попытался поиграть с IMultiValueConverter, но результат не получился.

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

1 Ответ

8 голосов
/ 08 января 2011

Это легко сделать с помощью механизмов проверки WPF.Во-первых, поскольку вы хотите следовать архитектуре WPF, я бы рекомендовал вам использовать модель команд WPF .

. Теперь для реализации ваших функций вы можете добавить CommandBinding в Window / UserControl.или для самого Button:

<Button Content="Save" Command="Save">

<Button.CommandBindings>
    <CommandBinding Command="Save" 
                    Executed="Save_Executed" CanExecute="Save_CanExecute" />
    </Button.CommandBindings>
</Button>

Теперь вы можете подписаться на событие CanExecute, чтобы включить или отключить кнопку на основе логики проверки.Я рекомендую эти чтения перед тем, как продолжить:

Проверка в Windows Presentation Foundation

Использование пользовательских правил проверки в WPF

Самый простой способ выполнить ваши требования, как указано ниже:

XAML

<Window x:Class="GridScroll.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:GridScroll"
    Title="Window1" Height="300" Width="300">

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="200"/>
    </Grid.ColumnDefinitions>

    <TextBlock Text="User Name" Grid.Column="0" Grid.Row="0"/>
    <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
    <TextBlock Text="Password" Grid.Column="0" Grid.Row="1"/>
    <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

    <Button Content="Save" Grid.Row="2" Grid.ColumnSpan="2" Width="100" HorizontalAlignment="Right" Command="Save">
        <Button.CommandBindings>
            <CommandBinding Command="Save" 
                    Executed="Save_Executed" CanExecute="Save_CanExecute"/>
        </Button.CommandBindings>

    </Button>
</Grid>

Code behind

public partial class Window1 : Window,INotifyPropertyChanged
{
    public Window1()
    {
        InitializeComponent();
        DataContext = this;
    }

    private string userName;
    public string Username
    {
        get
        {
            return userName;
        }
        set
        {
            userName = value;
            OnPropertyChanged("UserName");
        }
    }

    private string password;
    public string Password
    {
        get
        {
            return password;
        }
        set
        {
            password = value;
            OnPropertyChanged("Password");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    private void Save_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        //Your code
    }

    private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = !(string.IsNullOrEmpty(Username) && string.IsNullOrEmpty(Password));

    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...