Запретить пользователю вводить определенный символ в TextBox

Я использую WPF, MVVM-Light. В моем пользовательском интерфейсе у меня есть текстовое поле, и я хочу запретить пользователю вводить определенные символы в текстовое поле. Я знаю, что если мы будем использовать код программной части, я смогу обрабатывать события нажатия клавиши keyPress, могу ли я добиться этого с помощью MVVM? Можем ли мы использовать какое-то поведение или какие-то триггеры интерактивности?


person xaria    schedule 29.04.2013    source источник


Ответы (2)


Использование кода программной части совершенно нормально, поскольку MVVM обеспечивает, чтобы код программной части был связан только с вашим представлением.

Поэтому, если у вас есть логика, зависящая от представления, которая гласит: «Пользователь может вводить только числа в это поле», тогда совершенно нормально написать событие KeyPress для TextBox, которое позволяет обрабатывать только числовые клавиши. Вы даже можете бросить это в UserControl, чтобы его можно было использовать повторно.

Однако если ваша разрешенная логика символов основана на логике приложения, например «Пользователь может использовать только символы, определенные в файле app.config для этого строкового значения», тогда вам будет лучше проверить это в ViewModel.

Также обратите внимание, что ограничение отличается от проверки.

Если вы хотите проверить запись пользователя, я бы сделал это, используя IDataErrorInfo из уровня ViewModel и, возможно, привязку с режимом UpdateSourceTrigger=PropertyChanged, чтобы проверка проверялась после каждого нажатия клавиши.

Если вы хотите ограничить, какие символы можно вводить в TextBox, то я, вероятно, сделаю это из уровня представления в коде позади, поскольку это функциональность представления.

person Rachel    schedule 29.04.2013

Да, для фильтрации ввода способом MVVM я бы предложил использовать настраиваемый элемент управления (например, маскированный элемент управления TextBox) или поведение.

Недавно я искал хороший TextBox в маске, и есть бесплатный от Xceed, который вы можете найти здесь. Я не могу говорить с этим, так как я не использовал его, но я был доволен другими компонентами Xceed, которые я использовал в прошлом.

Однако я не хотел переходить к третьей стороне и включать кучу элементов управления, которые мне не нужны, поэтому в итоге я создал поведение, которое просто прикрепляется к TextBox и фильтрует ввод на основе FilterType. Поведение довольно легко создать, и вы просто используете событие PreviewTextInput, чтобы отфильтровать символы, которые вам не нужны.

В этом ответе SO есть ряд предложений и ссылок на то, как фильтровать / замаскируйте ввод и, если вы не знакомы с созданием присоединенного поведения, этот пример показывает, как создать присоединенное поведение для текстового поля с маской.

person Brian S    schedule 29.04.2013