Еще один способ реализовать это - установка привязки в обработчике событий, загруженном в TextBox.
Ниже приведено описание TextBox:
<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, где сравниваю входные данные со списком элементов, хранящихся в виде открытого свойства ObservableCollection, связанного с сеткой, в ApplicationViewModel. Код 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);
}
}
Приведенный выше код принимает входные данные и проверяет их доступность в наблюдаемой коллекции «Входы». Правило дает false ValidationResult, если значение существует. Благодаря этой реализации я проверяю уникальность входных данных во время выполнения.
Надеюсь, вам, ребята, понравилось.