Я хочу проверить записи Textbox для приложения и предоставить визуальную и устную обратную связь в случае ошибки. Мне бы хотелось, чтобы обычное поведение границ Textbox, которое вы получаете от wpf при использовании ValidationRules
или INotifyDataError
, затем в отдельном TextBlock отображало сообщение об ошибке. Стандартные вещи. У меня есть несколько способов подойти к этому, но каждый из них доставляет мне проблемы.
ValidationRules
кажется самым простым системным подходом. Моя проблема здесь заключается в привязке сообщения об ошибке к отдельному TextBlock. В большинстве примеров используются предъявители контента или шаблоны ошибок, но нет ли простого способа привязки к ValidationResult
напрямую? (Вопрос 1)
INotifyDataError
быть более современным подходом приятно в теории, но он кажется слишком сложным для того, что я делаю.
Однако, Самый простой способ, который я нашел, это проверка непосредственно в установщике свойства в Viewmodel. Примерно так:
private string _fileName;
public string FileName
{
get {return _fileName;}
set
{
_fileName = value;
if(String.IsEmptyOrNull(value))
{
FileNameError = "File must have a name.";
}
else
{
FileNameError = null;
}
RaisePropertyChanged();
}
}
private string _fileNameError;
public string FileNameError
{
get {return _fileNameError;}
set
{
_fileNameError = value;
RaisePropertyChanged();
}
}
Затем, чтобы показать ошибку, я могу привязать 2x к FileNameError
: один раз для отображения текста в TextBlock, а другой - через конвертер (проверка на! Null) чтобы показать красную рамку вокруг TextBox.
Проблема в том, что WPF делает красную рамку намного лучше; кажется, что это собственный элемент, а не фактическая граница. Когда я пытаюсь использовать мой конвертер StringToBorderBru sh, толщина границы уменьшает размер TextBox, поэтому все перестает совпадать. Двойной удар заключается в том, что, установив прозрачный BorderBru sh, я теряю границу TextBox по умолчанию и границу фокуса, которую я хотел бы сохранить.
Так что есть способ дублировать то, что делает WPF с границей, или как-то контролировать это с помощью собственности? Я думаю, это было бы возможно, потому что что-то должно вызывать это, когда это показано с ValidationRules
или INotifyDataError
, верно? (Вопрос 2)