MVP в Winforms - PullRequest
       32

MVP в Winforms

7 голосов
/ 16 февраля 2012

Я в основном из ASP.Net с некоторыми MVC. Я также немного поработал с Silverlight и MVVM, однако сейчас я собираюсь перейти к Winforms, с которыми у меня очень мало опыта, поэтому мне интересно, как справиться с MVP.

Типичные примеры MVP показывают, как докладчик устанавливает свойство представления (через некоторый интерфейс IView), а конкретный вид помещает значение этого свойства в текстовое поле, например. Вместо этого архаичного подхода можно использовать INotifyPropertyChanged в MVP, и если да, то как? Очень быстрый пример был бы действительно полезен!

Если бы я должен был создать модель, которая реализовала бы INotifyPropertyChanged, то разве это не больше похоже на MVVM? (то есть докладчик обновляет модель, и с помощью магии INotifyPropertyChanged представление обновляется). Тем не менее, везде, где я читал о MVVM и Winforms, люди говорят, что это не подходит. Зачем? Насколько я понимаю, вы можете привязать данные практически к любому свойству элемента управления, так чего же не хватает в Winforms? Я пытаюсь понять недостатки привязки данных в Winforms по сравнению с WPF и почему нельзя использовать MVVM, так как это кажется более простым для реализации, чем MVP.

Спасибо заранее Энди.

Ответы [ 3 ]

8 голосов
/ 03 мая 2012

Я только что проверил, как привязка данных в WinForms использует INotifyPropertyChanged . Привязка данных через BindingSource действительно поддерживает INotifyPropertyChanged , если DataSource объекта BindingSource или свойства модели, соответствующее DataMember реализует это. Вы можете использовать М. Фаулерса, контролирующего докладчика / диспетчера в полной мере здесь: Вам даже не нужен рукописный код, BindingSource синхронизирует представление со свойствами модели в обоих направлениях (модель -> вид и вид -> модель), и если модель поддерживает INotifyPropertyChanged , тогда представление будет обновлено автоматически. Конструкции кода, которые я использовал до сих пор:

  1. Во время инициализации просмотра:

    this.bindingSource.DataSource = this.presenter;

  2. Сгенерированный дизайнером код:

    this.textBoxPhone.DataBindings.Add (новый System.Windows.Forms.Binding («Текст», this.bindingSource, «Model.Phone», true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

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

public class Customer : INotifyPropertyChanged
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName == value)
                return;
            _firstName = value;
            NotifyPropertyChanged("FirstName");
        }
    }

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set
        {
            if (_lastName == value)
                return;
            _lastName = value;
            NotifyPropertyChanged("LastName");
        }
    }

    private string _company;
    public string Company
    {
        get { return _company; }
        set
        {
            if (_company == value)
                return;
            _company = value;
            NotifyPropertyChanged("Company");
        }
    }

    private string _phone;
    public string Phone
    {
        get { return _phone; }
        set
        {
            if (_phone == value)
                return;
            _phone = value;
            NotifyPropertyChanged("Phone");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

Класс докладчика:

public class CustomerPresenter
{
    public CustomerPresenter(Customer model)
    {
        if (model == null)
            throw new ArgumentNullException("model");

        this.Model = model;
    }

    public Customer Model { get; set; }

    public ICustomerView View { private get; set; }
}
0 голосов
/ 27 ноября 2012

Вы ничего не пропустите.MVVM очень подходит для WinForms.Microsoft только рекомендует использовать шаблон WPF и MVVM с ним.

0 голосов
/ 16 февраля 2012

Попытайтесь найти примеры вкуса Supervising Controller MVP, я использую это с WinForms, очень успешно, я бы сказал. Объекты поддерживают INotifyPropertyChanged, презентатор привязывает их к представлению, а презентатор подписывается на событие PropertyChanged, чтобы он знал, когда представление что-то изменило (грязная проверка). Представление отвечает только за привязку данных, все остальные функции перенесены на докладчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...