开始:
我有一个看起来像这样的视图:
public interface IAddressView
{
void Close();
bool IsDirty();
bool DoesUserWantToDiscardChanges();
}
我有一个看起来像这样的演示者:
public class AddressViewPresenter
{
private IAddressView m_addressView;
private Address m_address;
public AddressViewPresenter(IAddressView addressView)
{
m_addressView = addressView;
m_address = new Address();
}
public void CancelButtonClicked()
{
bool canClose = true;
if (m_addressView.IsDirty())
{
canClose = m_addressView.DoesUserWantToDiscardChanges();
}
if (canClose)
{
m_addressView.Close();
}
}
public void SaveButtonClicked()
{
// saving logic goes here...removed for brevity
m_addressView.Close();
}
}
然后我有一个窗口窗体,它有一个取消按钮、一个保存按钮和所有用于显示地址的控件。取消按钮运行:
m_addressPresenter.CancelButtonClicked();
它反过来检查视图是否脏并提示用户放弃任何更改。这很棒,这就是我想要的。
现在我的问题是,如果用户关闭表单而不单击“取消”(即他们单击右上角的“X”甚至按 ALT+F4),如何实现相同的效果。我尝试处理 FormClosing 事件,但最终复制了一些代码,如果单击取消按钮,弹出窗口会发生两次。这是我所拥有的:
private void AddressForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.IsDirty())
{
if (!this.DoesUserWantToDiscardChanges())
{
e.Cancel = true;
}
}
}