#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 к некоторым динамическим ресурсам
ОБНОВЛЕНИЕ В поисках лучшего решения я сделал это:
- Добавьте событие, которое проверяет уникальность, в ValidationRule
- Добавить обработчик в класс Window
- Вызвать событие из ValidationRule и проверить результат из EventArgs
Ответ №1:
К чему вы привязываетесь, для чего пытаетесь добавить проверку. Как я обычно справляюсь с этим, имея объект, который я привязываю, для реализации IDataErrorInfo. Затем я могу поместить свою обработку ошибок в этот объект и получить доступ ко всему, что мне нужно. Это было бы возможно, если бы вы контролировали объект, к которому вы привязываетесь.
Комментарии:
1. Я не могу реализовать IDataErrorInfo для объекта bisness
2. Можете ли вы обернуть свой бизнес-объект в ViewModel и реализовать его с помощью этого?