Кнопка включения на действительном TextBox - PullRequest
1 голос
/ 22 мая 2011

В WPF мне бы хотелось иметь TextBox и Button. Кнопка должна быть включена, только если длина текста в TextBox равна 10.

Я пытаюсь сделать это, используя Binding, но не запускается свойство IsValid, которое читается при вводе текста в TextBox.

Как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 25 апреля 2018

, если длина текста в TextBox равна 10 или больше 10

Попробуйте это

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (textBox1.Text.Length >= 10)
            button1.IsEnabled = true;
        else
            button1.IsEnabled = false;
    }
2 голосов
/ 22 мая 2011

Если у вас есть только эта зависимость и одно значение, для которого она действительна, вы можете использовать стиль:

<TextBox Name="tbTest"/>
<Button Content="Do Stuff">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=tbTest, Path=Text.Length}" Value="10">
                    <Setter Property="IsEnabled" Value="true"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

В противном случае вы должны определить ValidationRule, который следует добавить к привязке текста. Затем вы можете использовать выделенный код для проверки его допустимости или связать свойство IsEnabled с Validation.HasError (используя ValueConverter для инвертирования логического значения).

2 голосов
/ 22 мая 2011

У вас есть несколько способов сделать это.

Например, вы можете использовать Binding конвертер:

<TextBox>
    <Binding Path="Text" UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <WpfApplication1:MyValidationRule />
        </Binding.ValidationRules>
    </Binding>
</TextBox>

<Button>
     <Button.IsEnabled>
         <Binding ElementName="TB" Path="(Validation.HasError)">
             <Binding.Converter>
                 <WpfApplication1:TrueToFalseConverter/>
             </Binding.Converter>
         </Binding>
     </Button.IsEnabled>
 </Button>

public class TrueToFalseConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return !(bool) value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return !(bool)value;
    }
}

public class MyValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return new ValidationResult((value as string).Length == 10, null);
    }
}

Или (я бы порекомендовал) вы можете использовать команды и CanExecute:

<Button Command="{Binding Path=MyCommand}" />
<TextBox Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged}" />

public class MainWindowViewModel
{
    public RelayCommand MyCommand { get; private set; }

    public string Text { get; set; }

    public MainWindowViewModel()
    {
        Text = "";
        MyCommand = new RelayCommand(MyAction, CanExecute);
    }

    private bool CanExecute(object x)
    {
        return Text.Length == 10;
    }

    ....
}
0 голосов
/ 22 мая 2011

это не лучшая идея, но она полезна: вы можете использовать TextChanged

   private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (textBox1.Text.Length == 10)
            button1.IsEnabled = true;
        else
            button1.IsEnabled = false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...