另一种实现它的方法是在 TextBox 加载的事件处理程序中设置绑定。下面是TextBox的xaml:
<TextBox Grid.Row="0"
x:Name="txtName"
Text="{Binding Name}"
Loaded="TxtName_OnLoaded" />
现在在 TxtName_OnLoaded 事件处理程序后面的代码中将创建新的 Binding 对象并根据我们的需要对其进行初始化。我们还将在其中添加 ValidationRule。
private void TxtName_OnLoaded(object sender, RoutedEventArgs e)
{
ApplicationViewModel appVm = this.DataContext as ApplicationViewModel;
TextBox TxtName = sender as TextBox;
if (TxtName == null)
return;
Binding newBinding = new Binding("Name");
newBinding.ValidatesOnDataErrors = true;
newBinding.ValidatesOnExceptions = true;
newBinding.NotifyOnValidationError = true;
newBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
validator.ErrorMessage = "Labware name should be unique.";
validator.ApplicationViewModel = appVm;
if (!newBinding.ValidationRules.Contains(validator))
newBinding.ValidationRules.Add(validator);
TxtName.SetBinding(TextBox.TextProperty, newBinding);
}
正如您在上面的实现中看到的,我们创建了一个具有新绑定路径的 Binding 对象。还将 UpdateSourceTrigger 分配给新创建的 Binding 对象。
一个绑定可以有多个验证规则。我们将在其中添加一个验证规则。现在我们可以将绑定设置为文本框的 TextProperty。
好处:您可以将多个依赖对象绑定到验证规则对象的属性,而这在 xaml 中是不可能的。例如:
我用它来验证 TextChanged 事件的输入,在此我将输入与 ApplicationViewModel 中存储为公共 ObservableCollection 属性、与 Grid 绑定的项目列表进行比较。ValidationRule 代码如下:
public class UniqueValueValidator : ValidationRule
{
public string ErrorMessage { get; set; }
public ApplicationViewModel ApplicationViewModel { get; set; }
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
return null;
var lws = ApplicationViewModel.Inputs.Where(s => s.Name.Equals(value.ToString())).FirstOrDefault();
if (lws != null)
return new ValidationResult(false, ErrorMessage);
return new ValidationResult(true, null);
}
}
上面的代码接受输入并检查“输入”可观察集合中的可用性。如果值存在,则规则给出错误的 ValidationResult。通过这个实现,我检查了运行时输入的唯一性。
希望你们喜欢它。