0

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;
    }
}
4

0 に答える 0