在有效的TextBox上启用Button

时间:2011-05-22 14:02:36

标签: c# .net wpf data-binding

在WPF中,我想拥有TextBox和Button。仅当TextBox中文本的长度为10时才应启用按钮。

我正在尝试使用Binding执行此操作,但是当我在TextBox中键入时,它不会触发IsValid属性读取。

如何做到这一点?

4 个答案:

答案 0 :(得分:2)

如果你只有这个依赖项和一个有效的值,你可以使用样式:

<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反转布尔值)。

答案 1 :(得分:2)

你有很多方法可以做到。

例如,您可以使用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;
    }

    ....
}

答案 2 :(得分:2)

如果TextBox中的文本长度为10或大于10

试试这个

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (textBox1.Text.Length >= 10)
            button1.IsEnabled = true;
        else
            button1.IsEnabled = false;
    }

答案 3 :(得分:0)

这不是最好的主意,但它很有用:你可以使用TextChanged

   private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (textBox1.Text.Length == 10)
            button1.IsEnabled = true;
        else
            button1.IsEnabled = false;
    }