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

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

При условии, что у вас есть следующее:

  • MySuperView
  • MySuperViewModel

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

ViewModel:

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

Вид:

Command="{Binding SaveOrderCommand}"

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

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


person mmccurrey    schedule 01.07.2009    source источник


Ответы (3)


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

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

person Jose    schedule 02.07.2009

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

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

person Joe White    schedule 01.07.2009

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

person Chris Nicol    schedule 01.07.2009