Для этого есть пара шаблонов. Я обычно реализую в классе / модели интерфейс ISupportInitialize
, что потребует от вас создания BeginInit()
и EndInit()
в этих методах. Я просто устанавливаю private bool _isInitializing
в значение true или false.
В модели представления или где / когда вы создаете / заполняете вашу модель / класс, заключите ее в начало и конец init:
var o = new SampleObject();
o.BeginInit()
o.StartDate = DateTime.Now; //just some sample property...
o.EndInit();
Итак, в зависимости от того, как вызывается ваше ValidationRule, вы можете проверить состояние вашего _isInitializing
, чтобы узнать, нужно ли вам проверять.
В последнее время я использую валидаторы атрибутов, которые запускаются на PropertyChanged
, чтобы вы могли сделать что-то вроде:
[CustomValidator("ValidateStartDate")]
public DateTime StartDate
{ get ...
{
set
{
if(_startDate == value) return;
_startDate = value;
if(_isInitializing) return;
RaisePropertyChange(() => StartDate);
}..
Если вы не хотите беспокоиться о ISupportInitialize
, тогда передайте все значения, которые вам нужны, в ваших свойствах во время строительства, а не в собственности. Binding сначала запросит геттеры о ваших свойствах и получит их значения, а после чего все пройдет через установщик свойств и будет проверен:
//c-tor
public MyObject(DateTime start)
{
_startDate = start;
}