Winforms MVP演示者与演示者之间的沟通

Winforms MVP演示者与演示者之间的沟通,winforms,mvp,Winforms,Mvp,我目前正在为即将到来的基于WinForms和MVP设计模式的项目准备核心框架 我不确定,最好的方式是什么,如何在两个视图/演示者之间进行沟通。更具体地说,我有一个ListView和一个DetailView。当用户单击ListView中的某个项目时,我需要显示该项目的编辑表单,在我的示例中是DetailView 选项: ListPresenter是否应在单击事件上创建DetailPresenter?工厂可能会有所帮助 是否应将DetailPresenter实例注入ListPresenter构造函数

我目前正在为即将到来的基于WinForms和MVP设计模式的项目准备核心框架

我不确定,最好的方式是什么,如何在两个视图/演示者之间进行沟通。更具体地说,我有一个ListView和一个DetailView。当用户单击ListView中的某个项目时,我需要显示该项目的编辑表单,在我的示例中是DetailView

选项:

ListPresenter是否应在单击事件上创建DetailPresenter?工厂可能会有所帮助

是否应将DetailPresenter实例注入ListPresenter构造函数

我觉得2可能是正确的解决方案,但我更喜欢在我真正需要的时候创建DetailView/DetailPresenter,即当用户单击按钮时

下一个问题,我不知道如何处理它是对象的生命周期。当我将视图注入Presenter时,谁负责清理?我习惯了这种行为,清理工作是由创建它的同一方进行的。但在这种情况下,我可以想象视图可以由演示者处理

public class ListDetailPresenter
{
    private ListPresenter _listPresenter;
    private DetailPresenter _detailPresenter;

    public ListDetailPresenter()
    {
        _listPresenter = new ListPresenter();
        _detailPresenter = new DetailPresenter();

        _listPresenter.SelectionChanged += OnSelectionChanged;
    }

    private void OnSelectionChanged(object sender, EventArgs e)
    {
        _detailPresenter.SetItem(_listPresenter.SelectedItem);
    }
}
我希望这些问题不要太笼统,我已经阅读了很多关于MVC/MVP的文章,但它们大多只展示了如何实现单视图演示者通信


谢谢。

您可以将ListPresenter和DetailPresenter包装在ListDetailPresenter中

public class ListDetailPresenter
{
    private ListPresenter _listPresenter;
    private DetailPresenter _detailPresenter;

    public ListDetailPresenter()
    {
        _listPresenter = new ListPresenter();
        _detailPresenter = new DetailPresenter();

        _listPresenter.SelectionChanged += OnSelectionChanged;
    }

    private void OnSelectionChanged(object sender, EventArgs e)
    {
        _detailPresenter.SetItem(_listPresenter.SelectedItem);
    }
}

winforms不建议用于任何新项目。你应该认真考虑使用现有的,相关的技术。我知道WiFras暂时没有更新,可能永远不会更新,但对于一些项目,在我看来,仍然是完全有能力的技术。不管怎样,桌面.NET应用程序还有什么其他选择?WPF?仅仅因为它具有非常好的数据绑定功能,它并不能使它成为所有项目的完美解决方案。我们已经考虑过使用它,但决定仍然使用WinForms.Perfect-capable技术,直到您需要一些看起来不像Windows 3.1的东西,或者直到您需要正确地将UI与应用程序的行为分离。桌面.NET应用程序还有什么其他选择WPF是.Net Windows桌面UI的首选技术。无论使用winforms可以实现什么,您也可以使用10%的代码量在WPF中实现同样的效果。更不用说创造伟大用户体验的可定制性和易开发性了。我不会同意WinForms和WPF的观点。我已经使用了这两个和一些项目,它是WPF的其他我宁愿使用WinForms。然而,这个问题甚至对MVVM也是有效的。单击一个按钮,ViewModel会收到命令,现在怎么办?它是自己创建DetailViewModel,还是希望在ListViewModel构造函数中注入DetailViewModel?另外,谁负责对象的生命周期?同样的问题,不管是WinForms还是WPF。在MVVM中,ViewModels负责其子VM或细节VM的生命周期,并且视图只通过数据绑定响应,而不需要额外的管道。