如何在 MVP 中设置控件状态
How to set control state in MVP
我想在用户无法引发事件时禁用按钮(或其他控件)。做这个的最好方式是什么? View handles that or presenter should pass value by 属性 in view 然后视图将更新控件的状态。
例如,如果之前的查询未完成,用户不应开始新查询。
选项 1:
interface IView
{
event EventHandler Event;
}
class View : IView
{
private readonly Button _button;
public event EventHandler Event;
public void button_Click(object sender, EventArgs e)
{
_button.Enabled = false;
if(Event != null)
{
Event(this, EventArgs.Empty);
}
_button.Enabled = true;
}
}
class Presenter
{
public void View_Event(object sender, EventArgs e)
{
// code...
}
}
选项 2:
interface IView
{
event EventHandler Event;
bool CanRaiseEvent { set; }
}
class View : IView
{
private readonly Button _button;
public event EventHandler Event;
public bool CanRaiseEvent
{
set
{
_button.Enabled = value;
}
}
public void button_Click(object sender, EventArgs e)
{
if (Event != null)
{
Event(this, EventArgs.Empty);
}
}
}
class Presenter
{
private readonly IView _view;
public void View_Event(object sender, EventArgs e)
{
_view.CanRaiseEvent = false;
// code...
_view.CanRaiseEvent = true;
}
}
我知道我应该在执行下一个查询之前检查演示者查询的状态,但我想通知视图用户甚至不应该尝试。
我用于 MVP 设计的两个 'litmus' 测试是:1) 逻辑是否可测试?和 2) 我可以替换具体视图并且应用程序仍然有效吗?
从这个角度看,选项2更有吸引力。
我想在用户无法引发事件时禁用按钮(或其他控件)。做这个的最好方式是什么? View handles that or presenter should pass value by 属性 in view 然后视图将更新控件的状态。
例如,如果之前的查询未完成,用户不应开始新查询。
选项 1:
interface IView
{
event EventHandler Event;
}
class View : IView
{
private readonly Button _button;
public event EventHandler Event;
public void button_Click(object sender, EventArgs e)
{
_button.Enabled = false;
if(Event != null)
{
Event(this, EventArgs.Empty);
}
_button.Enabled = true;
}
}
class Presenter
{
public void View_Event(object sender, EventArgs e)
{
// code...
}
}
选项 2:
interface IView
{
event EventHandler Event;
bool CanRaiseEvent { set; }
}
class View : IView
{
private readonly Button _button;
public event EventHandler Event;
public bool CanRaiseEvent
{
set
{
_button.Enabled = value;
}
}
public void button_Click(object sender, EventArgs e)
{
if (Event != null)
{
Event(this, EventArgs.Empty);
}
}
}
class Presenter
{
private readonly IView _view;
public void View_Event(object sender, EventArgs e)
{
_view.CanRaiseEvent = false;
// code...
_view.CanRaiseEvent = true;
}
}
我知道我应该在执行下一个查询之前检查演示者查询的状态,但我想通知视图用户甚至不应该尝试。
我用于 MVP 设计的两个 'litmus' 测试是:1) 逻辑是否可测试?和 2) 我可以替换具体视图并且应用程序仍然有效吗?
从这个角度看,选项2更有吸引力。