这里有一个长成这个样子的视图:
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();
}
}
我随后有一个Windows表单,其中包含取消按钮、保存按钮和显示地址的所有控件。 取消按钮运行:
m_addressPresenter.CancelButtonClicked();
接下来检查视图是否已更改,并提示用户放弃任何更改。这很好,这正是我想要的。
现在我的问题是,如果用户关闭表单而没有点击取消(即他们点击右上角的“X”甚至按下ALT+F4),如何实现相同的效果。我尝试处理FormClosing事件,但最终导致了代码重复,并且如果我点击取消按钮,弹出窗口会出现两次。以下是我的代码:
private void AddressForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.IsDirty())
{
if (!this.DoesUserWantToDiscardChanges())
{
e.Cancel = true;
}
}
}