[WPF4, Validation] Как бы обновить валидацию?:)
От: Sinix  
Дата: 18.10.10 07:57
Оценка:
// псевдокод
public enum ControlProperties
{
  Name, Description, Foo, Bar
}

class CustomControl: Control: IDataErrorInfo
{
  public string Name { get; set; }
  public string Description { get; set; }
  public string Foo { get; set; }
  public string Bar { get; set; }

  public ControlProperties ValidProperties { get; set; }
  // ...
}


В шаблоне контрола:
{Binding Path=Name, RelativeSource={RelativeSource TemplatedParent}, ValidatesOnDataErrors=True}


Задача: обновить Validation.HasError (и, соответственно, вывод ошибок валидации) при изменении ValidProperties.
Доп условие: без обхода visual tree и поиска BindingExpression

Единственный найденный воркараунд:
  protected CustomControl Self { get; set; }
  protected event EventHandler SelfChanged

{Binding Path=Self.Name, RelativeSource={RelativeSource TemplatedParent}, ValidatesOnDataErrors=True}

И эти люди борются за звание дома высокой культуры быта! (с)
Re: [WPF4, Validation] Как бы обновить валидацию?:)
От: Sinix  
Дата: 19.10.10 02:32
Оценка:
Здравствуйте, Sinix, Вы писали:

Ап. Внезапно стало высокоприоритетной проблемой
Re: [WPF4, Validation] Как бы обновить валидацию?:)
От: MxMsk Португалия  
Дата: 19.10.10 06:48
Оценка: 16 (1)
Здравствуйте, Sinix, Вы писали:

S>И эти люди борются за звание дома высокой культуры быта! (с)

А что не так? ValidationRule имеет вполне конкретное назначение:

The binding engine checks each ValidationRule that is associated with a binding every time it transfers an input value, which is the binding target property value, to the binding source property.

Странно требовать от него догадаться, что какое-то левое свойство тоже влияет на валидацию

Как вариант, можно сделать MultiBinding на оба свойства (Path и ValidProperties) с конвертером, которое выбирает значение одного из них. Так потом можно все свойства забиндить "в паре" с ValidProperties .
Re[2]: [WPF4, Validation] Как бы обновить валидацию?:)
От: Sinix  
Дата: 19.10.10 07:05
Оценка:
Здравствуйте, MxMsk, Вы писали:


MM>Странно требовать от него догадаться, что какое-то левое свойство тоже влияет на валидацию

Дык он и не должен догадываться, это я должен дать знать, что свойство изменилось. С POCO достаточно OnPropertyChanged, с WPF приходится выделываться.

MM>Как вариант, можно сделать MultiBinding на оба свойства (Path и ValidProperties) с конвертером, которое выбирает значение одного из них. Так потом можно все свойства забиндить "в паре" с ValidProperties.


В теории — прекрасно. На практике свойства ValidProperties может и не быть (прототип пока), просто в один прекрасный момент потребуется обновить валидацию. Можно конечно и тут завести лишнее свойство, но этот вариант будет ничем не лучше, чем вариант с Self.
Re[3]: [WPF4, Validation] Как бы обновить валидацию?:)
От: MxMsk Португалия  
Дата: 19.10.10 07:42
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, MxMsk, Вы писали:



MM>>Странно требовать от него догадаться, что какое-то левое свойство тоже влияет на валидацию

S>Дык он и не должен догадываться, это я должен дать знать, что свойство изменилось. С POCO достаточно OnPropertyChanged, с WPF приходится выделываться.
Мне кажется, я что-то не так понял Что такое POCO и почему недостаточно OnPropertyChanged в WPF?

MM>>Как вариант, можно сделать MultiBinding на оба свойства (Path и ValidProperties) с конвертером, которое выбирает значение одного из них. Так потом можно все свойства забиндить "в паре" с ValidProperties.

S>В теории — прекрасно. На практике свойства ValidProperties может и не быть (прототип пока), просто в один прекрасный момент потребуется обновить валидацию. Можно конечно и тут завести лишнее свойство, но этот вариант будет ничем не лучше, чем вариант с Self.
Да, вариант немногим лучше. Это бесспорно.
Re[4]: [WPF4, Validation] Как бы обновить валидацию?:)
От: Sinix  
Дата: 19.10.10 07:52
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Мне кажется, я что-то не так понял Что такое POCO и почему недостаточно OnPropertyChanged в WPF?


Plain Old CLR Objects. В WPF FrameworkElement.OnPropertyChanged не вызывает ревалидацию прибинденных контролов, если значение не менялось.
Re[5]: [WPF4, Validation] Как бы обновить валидацию?:)
От: MxMsk Португалия  
Дата: 19.10.10 08:01
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Plain Old CLR Objects. В WPF FrameworkElement.OnPropertyChanged не вызывает ревалидацию прибинденных контролов, если значение не менялось.

Аааа. Ну да, не вызывает. Кстати, тоже это не нравится. Ведь есть однозначный контракт в виде события PropertyChanged, а так получается, что WPF добавляет свою логику.
Re[4]: [WPF4, Validation] Как бы обновить валидацию?:)
От: Sinix  
Дата: 19.10.10 08:02
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Да, вариант немногим лучше. Это бесспорно.


Не, это пипец. Если у нас цепочка биндингов, в моём варианте валидация не обновляется. Ваш вариант лучше
Re[4]: [WPF4, Validation] Как бы обновить валидацию?:)
От: Sinix  
Дата: 19.10.10 08:25
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Да, вариант немногим лучше. Это бесспорно.

Пипец #2. Нужен же 2-way biding, откуда в ConvertBack взять значения для ValidParameters?

Если возвращать unset value ValidParameters успешно заменяются дефолтным значением.
Re[5]: [WPF4, Validation] Как бы обновить валидацию?:)
От: MxMsk Португалия  
Дата: 19.10.10 09:04
Оценка: 7 (1)
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, MxMsk, Вы писали:


MM>>Да, вариант немногим лучше. Это бесспорно.

S>Пипец #2. Нужен же 2-way biding, откуда в ConvertBack взять значения для ValidParameters?

S>Если возвращать unset value ValidParameters успешно заменяются дефолтным значением.

А если попробовать Binding.DoNothing? Вот еще в помощь: тынц.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.