Я использую WPF, MVVM-Light. В моем пользовательском интерфейсе у меня есть текстовое поле, и я хочу запретить пользователю вводить определенные символы в текстовое поле. Я знаю, что если мы будем использовать код программной части, я смогу обрабатывать события нажатия клавиши keyPress, могу ли я добиться этого с помощью MVVM? Можем ли мы использовать какое-то поведение или какие-то триггеры интерактивности?
Запретить пользователю вводить определенный символ в TextBox
Ответы (2)
Использование кода программной части совершенно нормально, поскольку MVVM обеспечивает, чтобы код программной части был связан только с вашим представлением.
Поэтому, если у вас есть логика, зависящая от представления, которая гласит: «Пользователь может вводить только числа в это поле», тогда совершенно нормально написать событие KeyPress
для TextBox
, которое позволяет обрабатывать только числовые клавиши. Вы даже можете бросить это в UserControl
, чтобы его можно было использовать повторно.
Однако если ваша разрешенная логика символов основана на логике приложения, например «Пользователь может использовать только символы, определенные в файле app.config для этого строкового значения», тогда вам будет лучше проверить это в ViewModel.
Также обратите внимание, что ограничение отличается от проверки.
Если вы хотите проверить запись пользователя, я бы сделал это, используя IDataErrorInfo
из уровня ViewModel и, возможно, привязку с режимом UpdateSourceTrigger=PropertyChanged
, чтобы проверка проверялась после каждого нажатия клавиши.
Если вы хотите ограничить, какие символы можно вводить в TextBox
, то я, вероятно, сделаю это из уровня представления в коде позади, поскольку это функциональность представления.
Да, для фильтрации ввода способом MVVM я бы предложил использовать настраиваемый элемент управления (например, маскированный элемент управления TextBox
) или поведение.
Недавно я искал хороший TextBox
в маске, и есть бесплатный от Xceed, который вы можете найти здесь. Я не могу говорить с этим, так как я не использовал его, но я был доволен другими компонентами Xceed, которые я использовал в прошлом.
Однако я не хотел переходить к третьей стороне и включать кучу элементов управления, которые мне не нужны, поэтому в итоге я создал поведение, которое просто прикрепляется к TextBox
и фильтрует ввод на основе FilterType. Поведение довольно легко создать, и вы просто используете событие PreviewTextInput
, чтобы отфильтровать символы, которые вам не нужны.
В этом ответе SO есть ряд предложений и ссылок на то, как фильтровать / замаскируйте ввод и, если вы не знакомы с созданием присоединенного поведения, этот пример показывает, как создать присоединенное поведение для текстового поля с маской.