在WPF中,我想拥有TextBox和Button。仅当TextBox中文本的长度为10时才应启用按钮。
我正在尝试使用Binding执行此操作,但是当我在TextBox中键入时,它不会触发IsValid
属性读取。
如何做到这一点?
答案 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;
}