Вот так:
У меня есть вид, который выглядит следующим образом:
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;
}
}
}