Model View Presenter - Обработка более сложных элементов управления пользовательского интерфейса - PullRequest
1 голос
/ 15 июня 2009

Я исследую шаблон Presenter Model Viewer. Пока что мне нравится то, что я вижу, однако в значительной степени все статьи, веб-трансляции, подкасты и т. Д., Которые я видел, читал или слышал, имеют дело с установкой и извлечением простых типов из текстовых полей, и я изо всех сил пытаюсь понять, как поступить с более сложными элементами управления пользовательским интерфейсом.

Например, представьте, что у меня есть CheckedListBox. В этом CLB я хочу отобразить все доступные варианты и варианты, выбранные для данного экземпляра (представьте класс Friend с помощью списка FavouriteIceCreamFlavours). Я могу легко заполнить список, но как тогда я установлю, какие из них выбраны (скажем, при последующем редактировании этого друга). Кроме того, как мне сохранить эти изменения обратно в базовый объект Friend?

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

Приветствия

Ленни.

(PS Я разрабатываю в среде C # 3.5 / WinForms)

1 Ответ

0 голосов
/ 30 июня 2009

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

Я бы имел:

Интерфейс ведущего:

Interface IPresenter
{
   bool DeleteItem(string itemName);
}

Просмотр класса:

class View : IView
{
   IPresenter presenter = new Presenter(this);

   void DeleteButtonClick(//SomeEventArgs)
   {
      bool vaild = this.presentor.DeleteItem(//Get the selected item);
      if (vaild)
      { //Delete the item from the tree view }
   } 
}

Ведущий класса:

class Presenter : IPresenter
{
     public bool DeleteItem(string itemName)
     {
       // Check for valid delete.
       return true or false
     }
}

Надеюсь, это должно сработать.

...