Взаимодействие пользовательского интерфейса с MVVM

2

Я сделал какой-то поисковик и не нашел ответа на эту загадку.

Если у вас есть следующее:

  • MySuperView
  • MySuperViewModel

MySuperView имеет два текстовых поля, привязанных к строковым свойствам в ViewModel и используя команду DelegateCommand, чтобы связать вашу кнопку "Сохранить" с ViewModel с помощью синтаксиса, например:

ViewModel:

this.SaveOrderCommand = new DelegateCommand<object>(this.Save, this.CanSave);

Вид:

Command="{Binding SaveOrderCommand}"

Как вы относитесь к элементам пользовательского интерфейса, чтобы сделать взаимодействие с пользователем более приятным. Например, скажем, что более низкий уровень сбоя происходит во время действия сохранения DelegateCommand, и вы хотели бы запустить всплывающую подсказку одного из текстовых блоков. Как это обычно происходит?

Я хотел бы придерживаться как можно более чистого кода, но я не против размещения там специфического кода UI.

Теги:
wpf
mvvm
prism
viewmodel

3 ответа

6

Я бы рекомендовал, чтобы ваш 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}/>

Это поместит красную рамку вокруг текстового поля, и вы можете добавить шаблон ошибки проверки в стиль текстового поля, чтобы добавить всплывающую подсказку, чтобы увидеть здесь

1

Чтобы показать исключения во всплывающей подсказке, я бы добавил свойство ViewModel, которое выдает сообщение об ошибке как строку и привязывает его к TextBox ToolTip. Затем в методе "Сохранить" вы должны начать с установки этого свойства в пустую строку и затем выполнить всю реальную работу внутри try..catch, которая, если возникает исключение, выталкивает сообщение об исключении в это свойство, поэтому оно автоматически показывает в всплывающей подсказке.

Вам нужно будет предоставить уведомление об изменении для вашего свойства, либо сделав его DependencyProperty, либо используя INotifyPropertyChanged.

0

В принципе, вы хотели бы, чтобы свойства create для вашего представления наблюдали (обычно через триггеры), которые обновляли ваш интерфейс в зависимости от того, что происходит при выполнении вашего кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню