Winforms アプリケーションに MVP (Passive View) パターンを実装しようとしています。
私が理解している限り、MVP のパッシブ ビューの実装では、ビューはプレゼンターについて知りません。だから私は何とかそれと話す必要があります !これにはイベントを使用しました。
ここに私の問題があります!View で TextChanged イベントが発生すると、Presenter で OnSetName() メソッドが呼び出されるまでに FileName フィールドが変更されます。トラブルになりませんか!View in MVP は完全に受動的なままだと思いました!
特定の名前を受け入れないように、Presenter にロジックが必要だとします。しかし、OnSetName() メソッドに到達すると、既に設定されているため、チャンスはありません。
public partial class Form1 : IPassiveView
{
public Form1()
{
InitializeComponent();
}
public string FileName
{
get => textEdit1.Text;
set => textEdit1.Text = value;
}
public event EventHandler<string> NameChanged;
private void textEdit1_EditValueChanged(object sender, EventArgs e)
{
OnNameChanged(FileName);
}
protected virtual void OnNameChanged(string e)
{
NameChanged?.Invoke(this, e);
}
}
public interface IPassiveView
{
string FileName { get; set; }
event EventHandler<string> NameChanged;
}
public sealed class Presenter
{
private readonly IPassiveView _view;
public Presenter(IPassiveView view)
{
_view = view;
_view.NameChanged += (sender, s) => OnSetName(s);
}
public void OnSetName(string name)
{
_view.FileName = name;
}
}