#silverlight #validation #silverlight-4.0
#silverlight #проверка #silverlight-4.0
Вопрос:
У меня есть пользовательский элемент управления SL4. Он содержит указатель даты. Элемент управления предоставляет свойство зависимости DateTime (не обнуляемое, поскольку это обязательное поле). Я привязал выбранную дату выбора даты (которая является обнуляемым значением<DateTime>) к этому свойству DateTime {RelativeSource Self}, как двустороннее. Эта привязка работает, за исключением случаев, когда я ввожу нулевую дату в DatePicker. Привязка настроена с помощью ValidatesOnExceptions, поэтому граница выбора даты становится красной, но во всплывающей подсказке говорится «ввод не в правильном формате». Но в нем должно быть указано, что поле является обязательным.
Я попробовал пользовательский IValueConverter, который выдавал исключение (ValidationException, FormatException, InvalidOperationException. и т.д.) с пользовательским текстом, Но все они оказались необработанными.
Я знаю, что мой элемент управления мог бы реализовать INotifyDataErrorInfo, но проблема в том, что значение null даже не попадает в мой элемент управления, поскольку мое DateTime не имеет значения null, поэтому проверять нечего.
Я мог бы легко сделать это вообще без какой-либо привязки. Или путем привязки к скрытому обнуляемому свойству<DateTime> в моем элементе управления, проверки того, что это свойство не равно null, и предоставления другого свойства DateTime. Или путем предоставления ValueConverter, который преобразует null в DateTime.MinValue или что-то в этомроде.
Но все эти методы кажутся обходными, и я хотел бы найти лучшее решение. Каков наилучший способ справиться с этим?
Ответ №1:
Отправлено на Connect, голоса оценены. https://connect.microsoft.com/VisualStudio/feedback/details/661318/the-binding-engine-doesnt-handle-exceptions-from-a-converter
Ответ №2:
По сути, вам нужно присвоить значение, к которому вы привязываете свой указатель даты, значению с нулевым значением DateTime, даже если null не является допустимым значением.
Тогда вам просто нужно будет полагаться на свою логику проверки, чтобы гарантировать, что ваше приложение никогда не позволит обрабатывать / сохранять значение / что угодно, пока оно равно null.