У меня есть TextBox, который привязан к команде, как это:Сообщите пользователю, что команда не может быть выполнена
<TextBox Text="{Binding Path=TextContent, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=MyCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
Свойство TextContent
является строка определяется в ViewModel. Команда MyCommand
также определена в ViewModel. ViewModel не знает представление.
Команда будет вызываться всякий раз, когда TextBox имеет фокус и нажата клавиша ввода. К сожалению, если CanExecute
возвращает false, пользователь не может видеть (визуально), что команда не была выполнена, потому что в TextBox нет визуальных изменений.
Я ищу совет о том, как показать пользователю, что команда не может быть выполнена после того, как он нажал кнопку ввода.
Мои идеи (и мои сомнения о них):
Отключение TextBox, когда
CanExecute
возвращаетсяfalse
: Это не вариант, потому что возвращаемое значениеCanExecute
может изменить каждый раз, когда письмо набирается/изменено (текст в TextBox влияет на результатCanExecute
). Когда он отключен в первый раз, пользователь больше не может его вводить, поэтому он будет оставаться навсегда.Показать окно сообщения о том, что команда не была выполнена: помните, что ViewModel не знает представление. Возможно ли открыть окно сообщений из ViewModel? Кроме того, где я должен поместить вызов для открытия окна сообщения? Не внутри
CanExecute
, потому что я только хочу получить окно сообщения после попадания, а не каждый разCanExecute
возвращаетfalse
. Может быть, сделатьCanExecute
всегда возвращатьtrue
и делать проверки внутриExecute
: Если проверки в порядке, выполните команду, если нет, покажите сообщение пользователю. Но тогда, смысл иметьCanExecute
пропущен полностью ...
Я хочу, чтобы MVVM, но некоторые из отделенного кода для перенаправления материала в ViewModel кажется, хорошо для меня.
Что касается отображения ящиков сообщений в «View Model», вы можете использовать ориентированный на ** сервис ** подход, в котором вы можете ввести класс обслуживания окна сообщения, который может использоваться вашей моделью просмотра для отображения ящиков сообщений. Это гарантирует, что ваша модель просмотра останется верной шаблону MVVM. Я написал небольшую библиотеку, которая делает это на [GitHub] (https://github.com/mike-eason/MessageBoxAbstraction). –