1. xaml
<Grid>
<StackPanel>
<TextBox x:Name="textBox1" Margin="5"/>
<Slider x:Name="slider1" Minimum="-10" Maximum="110" Margin="5"/>
</StackPanel>
</Grid>
2. C#
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Binding binding = new Binding("Value") { Source = slider1 };//绑定到slider的Value属性
/*
* UpdateSourceTrigger属性控制绑定源更新的执行时间,默认为LostFocus
*
* LostFocus: 当TextBox失去焦点时,TextBox输入的内容才会更新源(slider)
* PropertyChanged: TextBox输入时,TextBox输入的内容就会更新源(slider)
*/
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
/* 实现数据检测,定义继承ValidationRule的DataValidChcker类,并实例化 */
DataValidChcker dataChecker = new DataValidChcker();//绑定“目标”数据有效性检测,TextBox输入数据有效性
/* 可选,需要检测“源”时设置为true */
dataChecker.ValidatesOnTargetUpdated = true;//绑定“源”数据的有效性检测,xaml设置最小值为-10,最大值为110。不在[0, 100]范围将认为无效
binding.ValidationRules.Add(dataChecker);//Binding有多个数据校验条件
/* 事件1: 当数据无效时,获取无效信息时设置为true */
binding.NotifyOnValidationError = true;//当数据校验为无效时,发出错误事件
textBox1.SetBinding(TextBox.TextProperty, binding);
/* 事件2: 当事件1为true时使用 */
textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(DataValidCheckErrorHandler));//当数据校验为无效时,处理事件
}
void DataValidCheckErrorHandler(object sender, RoutedEventArgs arg)
{
int errorCount = 0;
ReadOnlyObservableCollection<ValidationError> errors = Validation.GetErrors(textBox1);
if (null == errors)
{
textBox1.ToolTip = "Unknow";
return;
}
errorCount = errors.Count;
if (errorCount > 0)
{
textBox1.ToolTip = errors[0].ErrorContent.ToString();
}
else
{
textBox1.ToolTip = "valid data";
}
}
}
public class DataValidChcker : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
double data = 0.0;
if (double.TryParse(value.ToString(), out data))
{
if (data >= 0 && data <= 100)//有效范围: [0, 100]
{
return new ValidationResult(true, "data valid");//有效
}
}
return new ValidationResult(false, "data invalid");//无效
}
}