Привязка DataContext к ValidationRule

У меня есть настраиваемое 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 никогда не вызывается.

Кто-нибудь может посоветовать, как заставить эту привязку работать?

Заранее спасибо.

10
задан Martin Robins 3 December 2010 в 12:39
поделиться