У меня есть настраиваемое ValidationRule, которому требуется доступ к ViewModel для проверки предоставленного значения в сочетании с другими свойствами ViewModel. Ранее я пытался добиться этого с помощью ValidationGroup, но отказался от этой идеи, поскольку изменяемый мной код потребует значительного рефакторинга, чтобы включить этот маршрут.
Я нашел ветку в группе новостей который показал способ привязки DataContext элемента управления, в котором выполняется ValidationRule, к этому ValidationRule посредством промежуточного класса, унаследованного от DependencyObject, но я не могу заставить его привязать.
Кто-нибудь может помочь?
My ValidationRule выглядит следующим образом ...
class TotalQuantityValidator : CustomValidationRule {
public TotalQuantityValidator()
: base(@"The total number must be between 1 and 255.") {
}
public TotalQuantityValidatorContext Context { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
ValidationResult validationResult = ValidationResult.ValidResult;
if (this.Context != null && this.Context.ViewModel != null) {
int total = ...
if (total <= 0 || total > 255) {
validationResult = new ValidationResult(false, this.ErrorMessage);
}
}
return validationResult;
}
}
CustomValidationRule определяется следующим образом ...
public abstract class CustomValidationRule : ValidationRule {
protected CustomValidationRule(string defaultErrorMessage) {
this.ErrorMessage = defaultErrorMessage;
}
public string ErrorMessage { get; set; }
}
TotalQuantityValidatorContext определяется следующим образом ...
public class TotalQuantityValidatorContext : DependencyObject {
public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register(@"ViewModel",
typeof(MyViewModel), typeof(TotalQuantityValidatorContext),
new PropertyMetadata {
DefaultValue = null,
PropertyChangedCallback = new PropertyChangedCallback(TotalQuantityValidatorContext.ViewModelPropertyChanged)
});
public MyViewModel ViewModel {
get { return (MyViewModel)this.GetValue(TotalQuantityValidatorContext.ViewModelProperty); }
set { this.SetValue(TotalQuantityValidatorContext.ViewModelProperty, value); }
}
private static void ViewModelPropertyChanged(DependencyObject element, DependencyPropertyChangedEventArgs args) {
}
}
И все это используется таким образом ...
DataContext UserControl устанавливается на экземпляр MyViewModel в коде программной части. Я знаю, что эта привязка работает, поскольку привязки стандартных элементов управления работают должным образом.
Метод TotalQuantityValidator.Validate
вызывается правильно, но всякий раз, когда я смотрю на свойство ViewModel
объекта Контекст
, он всегда равен нулю (свойство Context
свойства TotalQuantityValidator
правильно установлено на экземпляр TotalQuantityValidatorContext
). Однако из отладчика я вижу, что установщик свойства ViewModel
в TotalQuantityValidatorContext
никогда не вызывается.
Кто-нибудь может посоветовать, как заставить эту привязку работать?
Заранее спасибо.