2009-03-06 3 views
1

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

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

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

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

+0

Мы говорим о Windows Forms или веб-формах здесь? Оба имеют компоненты с именем «ListView». –

+0

Или, может быть, даже WPF? Забыл об этом. –

+0

Это приложение Windows Form – Draco

ответ

2

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

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

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

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

Попробуйте также держать Просмотр кода такой простой, что вы можете «проверить» его быстрого просмотра кода :-)

1

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

1

данные позиции в ведущем. Назначают их к представлению и имеют данные вид обвязку для отображения элементов данных:

//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> 
+0

Привет, Kent, это приложение Windows Form, извините за это – Draco

+0

lol - не проблема. Тем не менее, применяется одна и та же теория. Презентатор является агностиком пользовательского интерфейса и передает данные в представление. View может использовать привязку или что угодно, чтобы отображать данные. –

0

Я недавно была такая же загадка, но и для дерева.

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

Пример:

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

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

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

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

0

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