3

MVPを使用しようとしていますが、私のビューは、私が推測するMVPでは発生しないモデルを認識している必要があることに気付きました。

ここに例があります:

public partial class TestForm : Form, ITestView
{
    public void LoadList(IEnumerable<AppSignature> data)
    {
        testPresenterBindingSource.DataSource = data;
    }
}

public interface ITestView
{
    event EventHandler<EventArgs> Load;
    void LoadList(IEnumerable<AppSignature> data);
}

public class TestPresenter
{
   private ITestView view;

   public TestPresenter(ITestView view)
   {  
       this.view = view;
       view.Load += View_Load;
   } 

   private void View_Load(object sender, EventArgs e)
   {
       var data = // get from model
       view.LoadList(data);
   }
}

問題は、TestFormでAppSignatureを参照する必要があることです。public void LoadList(IEnumerable<String> data)私が見たすべてのチュートリアルには、モデルを参照する必要がない場合など、いくつかの簡単な例が あります。しかし、どのようにしてDataGridViewが現在の行データを公開できるのでしょうか。

4

3 に答える 3

2

フォームはビューであり、プレゼンターではありません。したがって、インターフェイスを実装する必要がありますITestView

public interface ITestView
{
    event EventHandler Load;
    void LoadList(IEnumerable<AppSignatureDto> data);
}

また、プレゼンターは、ビューのイベントをサブスクライブし、ビューのプロパティを使用してビューを読み取って更新する人です。

public class TestPresenter
{
   private ITestView view;

   public TestPresenter(ITestView view)
   {  
       this.view = view;
       view.Load += View_Load;
   } 

   private void View_Load(object sender, EventArgs e)
   {
       List<AppSignature> signatures = // get from model
       List<AppSignatureDto> signatureDtos = // map domain class to dto
       view.LoadList(signatureDtos);
   }
}

そして、私がすでに言ったように、あなたはビューを形成します、それはプレゼンターとモデルについて何も知りません:

public partial class TestForm : Form, ITestView
{
    public event EventHandler Load;    

    private void ButtonLoad_Click(object sender, EventArgs e)
    {
        if (Load != null)
            Load(this, EventArgs.Empty);
    }

    public void LoadList(IEnumerable<AppSignatureDto> data)
    {
        // populate grid view here
    }
} 

ドメインクラスへの参照を処理する方法は?通常、単純なデータ(文字列、整数、日付など)のみを表示するか、データ転送オブジェクトを作成して表示に渡します(FooView、FooDtoなどの名前を付けることができます)。AtoMapperのようなもので簡単にそれらをマッピングすることができます:

List<AppSignatureDto> signatureDtos = 
      Mapper.Map<List<AppSignature>, List<AppSignatureDto>>(signatures);
于 2012-10-22T16:53:04.880 に答える
2

相互作用がデータバインディングのみに制限されている限り、ビューはモデルの知識を持っている可能性があります。つまり、ViewはModelを直接操作しようとしてはなりません。ビューは常にユーザー入力をプレゼンターにリダイレクトし、プレゼンターはそれ以降のアクションを処理します。Presenterによって実行されたアクションによってモデルの状態が変化した場合、モデルはデータバインディングを介してビューに通知します。モデルはビューの存在を完全に認識しません。

于 2012-10-22T16:55:53.227 に答える
0

Presenterでデータソースを取得してそこにデータソースを設定しても大丈夫ですか?例:プレゼンターコード:

Public void LoadData()
{
    _view.Data.DataSource = Business.GetData().ToList();
}

フォームコード:

Public BindingSource Data
{
    get
    {
        return this.bsData;
    }
}

そのおかげで、ビューへの参照を追加する必要はありませんが、他のソースではそのソリューションは見つかりませんでした。

于 2013-11-19T00:08:55.897 に答える