我想构建一个使用数据绑定的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] 删除。
我来说两句