我有两个classess和一个Userform。我试图不在我的classess中使用任何与Form相关的代码,但我对OOP很新。在CreateGraph()方法中,我想用“是/否”对话框提示用户。方法中的代码将根据结果继续。我已经阅读了一些关于MVP的例子,但并不完全确定我在这种情况下如何实现。
有人可以指导我吗?我相信我的代码中存在一些严重的设计问题
//singleton class
public class MyApplication
{
private int state;
private static MyApplication instance = null;
public void Task1()
{
GraphGenerator gg = new GraphGenerator();
gg.CreateGraph();
state = 1;
}
public void Task2()
{
//some other tasks..
state = 2;
}
}
我有问题的班级..
public class GraphGenerator
{
public void CreateGraph()
{
//some code for creating a graph..
//here i want to prompt the user with a
// Yes/No dialog box..
}
}
用户形式
public partial class Form1 : Form
{
private void btnTask1_Click(object sender, EventArgs e)
{
MyApplication ma = MyApplication.Instance;
ma.Task1();
}
private void btnTask1_Click(object sender, EventArgs e)
{
MyApplication ma = MyApplication.Instance;
ma.Task2();
}
}
答案 0 :(得分:2)
单件。控制器或演示者不应该是单身人士。通过构造函数注入它或在ctor中创建,然后使用类中的私有setter保存到字段或属性。例如:
public Form1(FormPresenter presenter)
{
InitializeComponent();
this.presenter = presenter;
}
这个简单样本的所有其他内容都是正常的。但是对于按钮事件处理程序,您可以在演示者/控制器中使用事件,并在特定于演示者/控制器事件的按钮事件处理程序中触发。
还尝试寻找MVC / MVP框架。在这里查看相关问题: Implementing MVC with Windows Forms
我记得那里有Microsoft Smart Client Guidance (CAB / Microsoft Composite Application Block)。
答案 1 :(得分:1)
首先,最好尽可能地设计类,这样就不需要将UI代码与域对象混合在一起。您是否可以重新构建代码,以便GraphGenerator
的调用方/所有者决定是否需要向用户询问而不是GraphGenerator
这样做?尽量让GraphGenerator
专注于他的任务或制作图表。
如果失败了,您可以在GraphGenerator
内定义事件(或委托或回调接口,但现在可以调用这些相关的机制事件),以便调用者/所有者可以监听来自GraphGenerator
的通知反过来与用户互动。例如,定义一个名为QueryConfirmSave
的事件来引发,调用者可以处理该事件并提示用户,然后将一个布尔值作为EventArg字段传回。
(代码将是这样的(从时髦,而不是编辑检查):
GraphGenerator gg = new GraphGenerator();
gg.QueryConfirmSave += new EventHandler<ConfirmSaveArgs>(GraphGenerator_QueryConfirmSave);
然后:
private void GraphGenerator_QueryConfirmSave(object sender, ConfirmSaveArgs args)
{
if (MessageBox.Show("Save?") == DialogResult.Yes)
{
args.SaveConfirmed = true;
}
}
答案 2 :(得分:-3)