ここに行きます:
次のようなビューがあります。
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 イベントを処理しようとしましたが、一部のコードを複製してしまい、キャンセル ボタンをクリックするとポップアップが 2 回発生します。ここに私が持っているものがあります:
private void AddressForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.IsDirty())
{
if (!this.DoesUserWantToDiscardChanges())
{
e.Cancel = true;
}
}
}