WPF MVVM - использование модели в классе модели представления - PullRequest
2 голосов
/ 04 февраля 2011

Я хотел бы знать, как правильно использовать класс модели в представленной модели. В качестве MVVM я использую Caliburn Micro.

Первая альтернатива.

Класс модели:

    public class CurrentUser : IDataErrorInfo
    {
        public string Nick { get; set; }
        public string Password { get; set; }
//...
    }

Использование модели в классе модели представления:

[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen
{
    public CurrentUser CurrentUser { get; set; }

    //bind on control in view
    public string CurrentNick
    {
        get { return CurrentUser.Nick; }
        set
        {
            CurrentUser.Nick = value;
            NotifyOfPropertyChange(() => CurrentNick);
        }
    }

    //bind on control in view
    public string CurrentPassword
    {
        get { return CurrentUser.Password; }
        set
        {
            CurrentUser.Password = value;
            NotifyOfPropertyChange(() => CurrentPassword);
        }
    }
}

Второй вариант:

Класс модели:

    public class CurrentUser : IDataErrorInfo, INotifyPropertyChanged
    {


        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public string Nick
        {
            get { return _nick; }
            set
            {
                _nick = value;
                NotifyPropertyChanged("Nick");
            }
        }

        public string Password
        {
            get { return _password; }
            set
            {
                _password = value;
                NotifyPropertyChanged("Password");
            }
        }
//...
    }

Использование класса модели в классе модели представления:

[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen
{
    //bind on UI control
    public CurrentUser CurrentUser { get; set; }
}

Ответы [ 4 ]

5 голосов
/ 04 февраля 2011

Я бы предпочел первый подход.Есть несколько причин, по которым:

  • A Model никогда не должен быть доступен для View.
  • Теоретически, ViewModel оборачивает / облицовывает все свойства, необходимые дляпривязан к View с Model.Он добавляет любые дополнительные свойства, коллекции и команды, необходимые для упрощения функциональности View и, в то же время, предотвращает помещение кода в код.
  • IDataErrorInfo и INotifyPropertyChanged облегчают View, а не ViewModel.А поскольку View связывается только с ViewModel, они должны быть внутри ViewModel.
5 голосов
/ 04 февраля 2011

Первый вариант будет лучше, так как он лучше инкапсулирует вашу модель из View.
Но вы должны реализовать IDataErrorInfo и INotifyPropertyChanged в ViewModel , поскольку ViewModel должен быть объектом, который уведомляет ваш пользовательский интерфейс об изменениях и ошибках.

1 голос
/ 05 февраля 2011

Я бы использовал второй подход.Если вы ищете примеры приложений, использующих второй подход, вам может быть интересен проект WPF Application Framework (WAF) .

0 голосов
/ 04 февраля 2011

Я бы рекомендовал начать со второго подхода.Это может уберечь вас от ввода множества повторяющихся свойств моста.Если вы столкнетесь со свойством, которое необходимо обернуть в модель представления, сделайте это для этого свойства, а затем обновите привязки вида.И ваша модель, и модель представления могут реализовывать IDataErrorInfo и INotifyPropertyChanged.Последнее весьма полезно, когда некоторая логика в вашей модели изменяет свойство, так как оно затем распространяется на представление.Реализуя эти интерфейсы через базовые классы, вы могли бы иметь как абстрактные классы ModelBase, так и ViewModelBase, где последний наследует первый.

...