在WPF中,我想要TextBox和Button。僅當TextBox中的文本長度爲10時才應啓用按鈕。在有效文本框上啓用按鈕
我正在嘗試使用綁定來完成此操作,但它不會觸發IsValid
屬性讀取,因爲我在TextBox中鍵入內容。
這怎麼辦?
在WPF中,我想要TextBox和Button。僅當TextBox中的文本長度爲10時才應啓用按鈕。在有效文本框上啓用按鈕
我正在嘗試使用綁定來完成此操作,但它不會觸發IsValid
屬性讀取,因爲我在TextBox中鍵入內容。
這怎麼辦?
如果你只是這種依賴和一個值,它是有效的,你可以使用樣式:
<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
反轉布爾值)。
這不是個好主意,但它是有用的:你可以用框TextChanged
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (textBox1.Text.Length == 10)
button1.IsEnabled = true;
else
button1.IsEnabled = false;
}
你有很多方法可以做到這一點。
例如,你可以使用綁定轉換器:
<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;
}
....
}
這是觸發對。 – dave 2011-05-22 14:30:11