Я сделал какой-то поисковик и не нашел ответа на эту загадку.
Если у вас есть следующее:
MySuperView имеет два текстовых поля, привязанных к строковым свойствам в ViewModel и используя команду DelegateCommand, чтобы связать вашу кнопку "Сохранить" с ViewModel с помощью синтаксиса, например:
ViewModel:
this.SaveOrderCommand = new DelegateCommand<object>(this.Save, this.CanSave);
Вид:
Command="{Binding SaveOrderCommand}"
Как вы относитесь к элементам пользовательского интерфейса, чтобы сделать взаимодействие с пользователем более приятным. Например, скажем, что более низкий уровень сбоя происходит во время действия сохранения DelegateCommand, и вы хотели бы запустить всплывающую подсказку одного из текстовых блоков. Как это обычно происходит?
Я хотел бы придерживаться как можно более чистого кода, но я не против размещения там специфического кода UI.
Я бы рекомендовал, чтобы ваш ViewModel реализовал IDataErrorInfo, чтобы вы могли использовать материал проверки в WPF. Вам не нужно ждать, пока кто-то нажимает кнопку сохранения, после того, как текстовое поле будет обновлено, оно будет проверено.
public string this[ColumnName]
{
if (Column == "TextProperty")
{
if(!ValidateTextProperty())
return "TextProperty is invalid";
}
}
void Save(object param)
{
if (CanSave)
{
if (string.IsNullOrEmpty(this["TextProperty"])
{
//Add Save code here
}
}
}
В вашем представлении:
<TextBox Text={Binding TextProperty, ValidateOnDataErrors="true",
UpdateSourceTrigger=PropertyChanged}/>
Это поместит красную рамку вокруг текстового поля, и вы можете добавить шаблон ошибки проверки в стиль текстового поля, чтобы добавить всплывающую подсказку, чтобы увидеть здесь
Чтобы показать исключения во всплывающей подсказке, я бы добавил свойство ViewModel, которое выдает сообщение об ошибке как строку и привязывает его к TextBox ToolTip. Затем в методе "Сохранить" вы должны начать с установки этого свойства в пустую строку и затем выполнить всю реальную работу внутри try..catch, которая, если возникает исключение, выталкивает сообщение об исключении в это свойство, поэтому оно автоматически показывает в всплывающей подсказке.
Вам нужно будет предоставить уведомление об изменении для вашего свойства, либо сделав его DependencyProperty, либо используя INotifyPropertyChanged.
В принципе, вы хотели бы, чтобы свойства create для вашего представления наблюдали (обычно через триггеры), которые обновляли ваш интерфейс в зависимости от того, что происходит при выполнении вашего кода.