Проверка текстового поля WPF: получить контроль / дублировать границу проверки системы? - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу проверить записи 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)

...