2012-10-22 60 views
2

我想使用MVP,我注意到我的视图必须知道模型,不应该发生在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如何发布当前行数据?

回答

1

您的表单是一个视图,它不是演示者。因此,它应该实现接口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地图:

​​
+0

你说得对。正如你所指出的那样,我改变了我的帖子,但问题依然存在。 – userbb

+0

@userbb请看我更新的答案 –

1

的看法可能有模式的知识,只要互动仅限于数据只能绑定。即视图不应该直接操纵模型。 View将始终将用户输入重定向到Presenter,并且Presenter将负责进一步的操作。如果Presenter执行的任何操作导致模型状态发生变化,模型将通过数据绑定通知View。模型将完全不知道View的存在。

0

是否可以在Presenter中获取DataSource并设置其DataSource? 例如 演示代码:

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

表单代码:

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

感谢,我不需要任何引用添加到搜索,但我没有看到任何其他来源的解决方案。