Где я должен создать список ListViewItem при использовании шаблона MVP? - PullRequest
1 голос
/ 06 марта 2009

У меня есть небольшое приложение, которое я написал и использует шаблон MVP следующим образом:

  • Я создал интерфейс под названием IView
  • Я реализовал этот интерфейс в форме
  • Передается в экземпляре формы как тип IView в конструктор презентатора

Форма содержит компонент ListView. Элементы, которые заполняют ListView, создаются в презентаторе. Я слышал, что это не очень хорошая идея использовать классы компонентов пользовательского интерфейса в докладчике. Как и где я должен создать эти ListViewItems? Я мог бы создать ListViewItems в самой форме, но разве форма не должна быть настолько легкой, насколько это возможно без какой-либо логики?

Редактировать: N.B. Это приложение Windows Form

Ответы [ 5 ]

2 голосов
/ 06 марта 2009

Я мог бы создать ListViewItems в сама форма, но не форма должны быть максимально легкими без логики?

Простой цикл и создание простых объектов не предполагаются сложными. Такой код довольно легковесен для просмотра:

class SomeView 
{
  void SetData(IEnumerable<DataItem> dataItems) 
  {
    foreach(DataItem dataItem in dataItems) 
    {
      ListViewItem lvi = new ListViewItem();
      lvi.Text = dataItem.Text;
      ...
    }
  }
}

Кроме того, вы можете использовать Binding (как предлагали другие). Это упростит SetData еще больше.

Постарайтесь также сделать View code таким простым, чтобы его можно было "проверить" путем быстрого просмотра кода: -)

1 голос
/ 06 марта 2009

Создание элементов данных в докладчике. Присвойте их представлению и сделайте так, чтобы привязка данных использовалась для отображения элементов данных:

//in presenter
var dataItems = _someService.GetData();
_view.Data = dataItems;

//in view code-behind
public ICollection<DataItem> Data
{
    get; set; //omitted for brevity - will require change notification
}

//in view XAML
<ListView ItemsSource="{Binding Data}">
  <ListView.View>
    <GridView>
      <GridViewColumn DisplayMemberBinding="{Binding Path=Name}"/> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Age}"/> 
    </GridView>
  </ListView.View>
</ListView>
1 голос
/ 06 марта 2009

ListViewItems являются специфическими для представления, поэтому вы должны создать их в представлении. Если вы создаете их в докладчике, все представления должны зависеть от ListViewItems, что не очень хорошо.

0 голосов
/ 06 марта 2009

WinForms как технология не предназначена для MVP, поэтому хорошая идея разделения интересов должна применяться с разумом. Я ожидаю, что контроль в форме, докладчик должен быть свободен от конкретных вещей. Любой элемент управления сам по себе нарушает mvp, потому что он содержит данные и представление. По мере того как ваше приложение будет расти, поддерживать его в стиле MVP будет все сложнее и сложнее. Там нет особой выгоды в реализации MVP. Обычно с WinForms работает традиционный стиль управления (компонентный стиль).

0 голосов
/ 06 марта 2009

У меня недавно была та же головоломка, но для дерева.

Чтобы решить эту проблему, вы должны использовать делегатов для управления созданием / преобразованием данных в визуальные элементы.

Пример:

class View
{
  TreeNode Builder(object foo, object bar) { ... }
}

class Presenter
{
  void InitView(View v)
  {
    Model.Build(v.Builder);
  }
}

Хорошо, это очень грубо, но позволяет довольно легко создавать рекурсивные структуры, такие как деревья. :)

ПРИМЕЧАНИЕ: модель и вид на самом деле не заботятся о типах друг друга.

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