Привязка ValidationRule к контексту Windows

#wpf #binding

#wpf #привязка

Вопрос:

Я пытаюсь создать ValidationRule, которое зависит от некоторого свойства (например) модели данных.

У меня есть текстовое поле с валидатором, которое должно знать об объекте модели «Схема». Я пытался добавить схему в ресурсы, но это не сработало. И после того, как я нашел какое-то решение, основанное на свойствах зависимостей.

В соответствии с этим http://dedjo.blogspot.com/2007/05/fully-binded-validation-by-using.html Я сделал:

 /// <summary>
/// Check text value for emptiness and uniqueness
/// </summary>
public class EmptyAndUnique : ValidationRule
{
    public UniqueChecker UniqueChecker { get; set; }

    public string ErrorMessage { get; set; }

    public override ValidationResult Validate(object value,
        CultureInfo cultureInfo)
    {
        string inputString = (value).ToString();
        var result = new ValidationResult(true, null);

        // Check uniqueness
        if(this.UniqueChecker.Scheme.Factors.Any(f => f.Uid == inputString))
        {
            result = new ValidationResult(false, this.ErrorMessage);
            return resu<
        }

        // Check emptiness
        if (inputString.Trim().Equals(string.Empty))
        {
            result = new ValidationResult(false, this.ErrorMessage);
            return resu<
        }

        return resu<
    }
}

/// <summary>
/// Wrapper for DependencyProperty. (trick)
/// </summary>
public class UniqueChecker : DependencyObject
{
    public static readonly DependencyProperty SchemeProperty =
        DependencyProperty.Register("Scheme", typeof(Scheme),
        typeof(UniqueChecker), new FrameworkPropertyMetadata(null));

    public Scheme Scheme
    {
        get { return (Scheme)GetValue(SchemeProperty); }
        set { SetValue(SchemeProperty, value); }
    }
}
  

Это тоже не работает.

1) Согласно статье:

 Scheme="{Binding      ElementName=expressionFactorEditorWindow, Path=Scheme}"
  

это не работает, потому что:

поскольку наш объект зависимости не является частью логического дерева, поэтому вы не можете использовать ElementName или DataContext в качестве источника для внутренней привязки данных.

Но почему это не часть логического дерева?

2) Как я могу привязать свойства моего ValidationRule к некоторым динамическим ресурсам

ОБНОВЛЕНИЕ В поисках лучшего решения я сделал это:

  1. Добавьте событие, которое проверяет уникальность, в ValidationRule
  2. Добавить обработчик в класс Window
  3. Вызвать событие из ValidationRule и проверить результат из EventArgs

Ответ №1:

К чему вы привязываетесь, для чего пытаетесь добавить проверку. Как я обычно справляюсь с этим, имея объект, который я привязываю, для реализации IDataErrorInfo. Затем я могу поместить свою обработку ошибок в этот объект и получить доступ ко всему, что мне нужно. Это было бы возможно, если бы вы контролировали объект, к которому вы привязываетесь.

Комментарии:

1. Я не могу реализовать IDataErrorInfo для объекта bisness

2. Можете ли вы обернуть свой бизнес-объект в ViewModel и реализовать его с помощью этого?