5

私はMVPパターン全体に頭を悩ませ始めました。単一のオブジェクトでうまくやっているにもかかわらず、コレクションに関しては難しくなり始めています。

では、フォーム内の DataGrid で構成される単純な WinForms アプリケーションを設計しているとしましょう。データ モデルは単純なコレクションであり、そのようなものには多くのプロパティがあり、View は実際にそれらを表示します。

モデル

public class Person
{
    public string Name { get; set; }
    public DateTime Birth { get; set; }
    public bool IsCool { get; set; }
}

public class People
{
    public List<Person> Persons { get; set; }
}

意見

public interface IPeopleView
{
    List<People> ListOfPeople { get; set; }
}

public partial class PeopleViewImpl : Form, IPeopleView
{
    private DataGridView _grid = new DataGridView();

    public PeopleViewImpl()
    {
        InitializeComponent();
    }

    // Implementation of IPeopleView
    public List<People> ListOfPeople
    {
        get { return /* TODO */; }
        set { _grid.DataSource = value; }
    }
}

プレゼンター

public class PeoplePresenter
{
    private People _model;
    private IPeopleView _view;

    public PeoplePresenter(People model, IPeopleView view)
    {
        _model = model;
        _view = view;
    }

    void UpdateView()
    {
        _view.ListOfPeople = _model.Peoples;
    }
}

では、View のList<People> ListOfPeoplegetter に何を実装し、Presenter をどのように呼び出せばよいのUpdateView()でしょうか?

そして一般的に、MVP Passive ViewSupervising Controllerをそれぞれ実現するために、どの追加の Presenter メソッドがあれば興味深いでしょうか?

アドバイス、コード スタイルのレビュー、または意見をいただければ幸いです。よろしくお願いします。

4

2 に答える 2

7

まず、1 つのパターンを決定する必要があります。

  • データバインディングを活用したい場合、および自動ビューテスト用のツールが利用可能な場合は、Supervising Controller が適切です。
  • パッシブ ビューは、ビュー データがより複雑になった場合、または完全なビューのために純粋な単体テストに依存する必要がある場合に示されます。
  • プレゼンテーション モデル (モデル ビュー ビューモデルとも呼ばれる) は、完全なビュー ステートに簡単にアクセスする必要があり、コード生成が利用できる場合に最適です。

すべての側面と、役立つ考慮事項や例へのリンクを集めました。

どちらの場合も、 aPeopleModelと letPeopleViewImplementation参照を定義する必要がありますPeopleModel。これにより、モデルがビューから明確に分離されます。

コレクションに関して言えば、Supervising Controller は、リストの へのデータ バインディングに依存できますDataGridViewリストへの winForms + DataGridView バインディングを参照してください。パッシブ ビューとプレゼンテーション モデルのみ、リストをビュー フィールドに、それぞれプレゼンテーション モデルにマッピングするための追加コードが必要です。

次に、データ マッピングを明確にする必要があります。PeopleView人物のリストまたは複数の人物のリストを表示する必要がありますか。はDataGridView、1 行に 1 人、または 1 行に 1 人を表示できます。行ごとに 1 人の人物が表示される場合、人物の処理は次のいずれかの方法で行うことができます。たとえば、次のようになります。

  • 1 つのページに 1 人のすべての人を表示し、異なる人々の間を移動するためのページャー要素を追加します
  • データ グリッド内の 1 人のすべての人物を表示し、すべての人物を含むツリーなど、人物の選択ウィジェットを追加します。
  • データ グリッドにさまざまな人々の人物を混在させ、列を追加して各人物の人々を表示します
于 2012-01-18T19:35:55.353 に答える
2

私の提案は、そのコレクションの ViewModel を持つことです。ビューの実装には、新しいインスタンスを作成し、古いインスタンスを更新する責任がありますが、実際のモデルには何も触れません。それらを取得するには、行を繰り返して新しく作成するだけです。最後に、プレゼンターはそのコレクションを繰り返し、モデルの各メンバーを作成/更新します。(コレクションが 1 回だけ反復されるように、IEnumerable<> と yield return を使用することもお勧めします)。

データを表示するために、このViewModelを使用することもできます(一貫性があるため)。または、実際のモデルが何らかの理由で異なる場合は(読み取り専用の方法で)実際のモデルを使用することもできます(編集できる情報よりも多くの情報を表示する可能性があります)。

それが役に立てば幸い。

于 2011-12-23T06:07:05.947 に答える