有关如何为数据绑定Windows Forms应用程序实现MVP模式的一些准则

艾森

我想构建一个使用数据绑定的Windows窗体应用程序,我认为这是使用绑定源。我将把一个大数据表的不同部分加载到3个单独的datagridviews中,并且将适应以下操作:

1)将整列数据从一个datagridview移到另一个

2)编辑单元格内的值

3)过滤数据

4)将来,还要适应于获取实时数据,并在出现时立即显示任何新数据。

我的第一种方法(对我而言似乎合乎逻辑)是入口点可能是演示者,然后演示者将创建视图。但是,我正在认真考虑另一种方法,即有一个单独的类来创建演示者,视图和模型。

一个问题是:在这种特定情况下,这两种方法中的一种可能更好吗?

第二个问题:现在我的过滤是立即进行的。但是,如果我实现了MVP,则意味着筛选操作将必须经过presenter类,这将更新模型,然后再返回到presenter,这将更新视图。对于用户而言,这可能不是一种视觉吸引力的体验。如果将视图直接连接到此类操作的模型(受监督的MVP),可能会更好吗?

第三:为将弹出的其他用户控件创建演示者,这是一种正确的方法,但是他们将无法直接访问模型,而必须首先经过应用程序的主要演示者?

尼莫

这就是我在Winforms上做过MVP的方式,并且效果很好,

1)模型-视图绑定的数据结构

2)视图-所有视觉逻辑的封装

3)控制器-封装在视图/模型上执行的所有操作

下面是一个例子,

//Model
class Person : INotifyPropertyChanged
{
    //Properties with notification
}

//Views
abstract class View
{
    //Base class for all views
    public abstract void SetDataSource(object source);
    protected virtual void Refresh();
    public abstract void Show();
}

//Data grid view
class DataGridView : View
{
    private Controller _controller = null;
    private System.Windows.Forms.DataGrid _grid = new System.Windows.Forms.DataGrid();

    public DataGridView(Controller controller)
    {
        _controller = controller;
    }

    public override void SetDataSource(object dataSource)
    {
        _grid.DataSource = dataSource;
    }

    public override void Show()
    {
    }

    protected override void Refresh
    {
        _grid.Refresh();
    }
}

//Controllers
abstract class Controller
{
    //Base controller
    public abstract void Init();
    public abstract void Show();
    public abstract void ViewChanged(object args);//To receive view changes
}

//Person presenter
class PersonGridController : Controller
{
    private DataGridView _view = new DataGridView(this);
    private BindingList<Person> _persons = new BindingList<Person>();

    public override void Init()
    {
        //Initialize persons
        //Optional, start thread/timer to update persons in background
    }

    public override void Show()
    {
        _view.SetDataSource(_persons);
        _view.Show();
    }

    public override void ViewChanged(object args)
    {
        //Based on arguments, perform filter, edit, save, etc.
    }
}

这是我过去使用的基本结构。Controller和View之间存在耦合,我们可以使用依赖注入(使用Unity等框架)来解除耦合,并将创建View的逻辑移到Controller之外。我也有一个Workspace管理器类,该类将View托管在Window内。如果您想使其更简单,则View可以从Window类继承。

关于你的问题,

1)应该通过数据源将列从一个网格移动到另一个网格

2&3)可以使用Controller.ViewChanged()事件来完成过滤和编辑

4)实时更新可以使用Controller.Init()函数,可以生成线程,以便可以在后台更新数据源。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

需要一些有关如何基于golang实现Restfull API应用程序的帮助

有关如何为前端应用程序创建Webjar的分步指南?

如何在Xamarin Forms应用程序本地保存一些用户数据?

我在应用程序中有一些错误

需要一些有关为我的应用程序用户创建云存储的建议

有关elf文件,节标题以及它们在运行应用程序时通常如何工作的一些初学者问题

如何获取有关数据库的一些信息并在AppWidgetProvider上显示

如何从crashlytics清除有关应用登出的数据

Google应用程序脚本:如何为自动电子邮件添加一些样式?

什么是Kiosk模式,以及如何为Xamarim.Forms应用程序实现它?

Windows Local应用程序运行正常,但Windows应用商店中的应用程序存在一些问题

如何在 Oro 应用程序的所有页面上共享一些树枝模板?

屏幕旋转时我的应用程序丢失了一些数据

tableview会使应用程序变慢,并花费一些时间来获取数据-swiftyJSON

有关在Angular 2应用程序加载时该怎么做的一些问题

Android,如何提取系统应用程序并执行一些检查

如何在UWP安装的应用程序中添加一些源代码?

如何在我的Android应用程序中添加一些“信息”按钮

如何在Spring JPA Web应用程序中设置一些Hibernate属性?

如何在ASP.NET应用程序中调用一些异步代码

如何通过延迟/延迟一些启动应用程序来减少登录时间?

应用程序退出后如何运行一些代码

如何对AppStore中的更新应用程序版本执行一些操作

Azure AD应用程序-如何从C#或Powershell设置一些参数?

有关如何构建程序的建议

一些网站要求您下载其AppStore应用程序-如何为我的网站执行此操作?

有关JSON数据到C#Winforms TreeView的一些问题

有关Google数据融合的一些问题

有关端口转发和数据包的一些疑问