3

UserControlは実際には派手な単純なものを実装していTextBoxます。その機能の 1 つは、書式設定の仕様を設定できることです。この書式設定はコンテンツに自動的に適用されます。たとえば、書式指定を に設定し"000"、内容が"42"の場合、 then"042"が表示されます。

UserControlMVPパターンに従ってこれを実装しています。実装はこれに似ています: winforms mvp パターンでユーザーコントロールを実装する方法? . また、この質問を確認してください:パッシブビューと表示ロジック

アプローチ #1

の私のTitleプロパティは次のViewようになります。

private string title;
public string Title {
    get { return title; }
    set { title = value; titleTextBox.Text = presenter.Format(title); }
}

この実装により不要なカップリングが追加されているように感じます。たとえば、PresenterFormatメソッドを変更すると、すべてViewの を調べて call ステートメントを適切に変更する必要があります。

アプローチ #2

の私のTitleプロパティは次のViewようになります。

public string Title {
    get { return presenter.Title; }
    set { presenter.Title = value; }
}

の私のTitleプロパティは次のPresenterようになります。

private string title;
public string Title {
    get { return title; }
    set { _view.SetTitle(this.Format(value); }
}

ここで、インターフェイスと実装にSetTitleメソッドを追加する必要があります。ViewView

public void SetTitle(string title) {
    titleTextBox.Text = title;
}

したがって、このアプローチでは、この醜いSetTitleJava のようなメソッドが得られます。

アプローチ #3

呼び出す代わりにSetTitle、新しいプロパティを作成しRealTitleView設定します。このRealプレフィックスでは醜いままです。

あなたのアプローチ

もっと良い方法を考えられますか?

使用事例

は次のUserControlように使用する必要があります。

var c = new FancyTextBox();
c.Format = "000";
c.Text = "42";
Controls.Add(c);

このスニペット"042"UserControl.

大きな絵

Form            FancyTextBoxView             FancyTextBoxPresenter
  |                     |                              |
  |  ftb.Text = "42"    |                              |
  |-------------------->|                              |
  |                     |                              |
  |                     |              A               |
  |                     |----------------------------->|
  |                     |                              |
  |                     |              B               |
  |                     |<-----------------------------|

AアクションとBアクションとは?書式設定されたテキストを UI に表示したい。書式設定コードはPresenter. ViewにはtitleTextBox、UI にテキストを保持する があります。

4

2 に答える 2

2

View の Title プロパティを次のように定義してみませんか?

public string Title {
    get { return titleTextBox.Text; }
    set { titleTextBox.Text = value; }
}

追加の SetTitle メソッドを定義する理由はまったくありません。また、MVP では、ビューがプレゼンターについて認識してはなりません。

次に、 Format 関数がトリガーされるたびに、そこからビューのタイトルを設定できます。次に例を示します。

void OnFormatCalled()
{
   _view.Title = FormatTitle(_view.Title);
}
于 2011-09-30T12:47:36.413 に答える
1

私は通常、View インターフェイス (および Model インターフェイス) を Presenter に挿入します。これで、依存関係とテストについて心配する場所が 1 か所になりました。

タイトルが設定されたときにビューにイベントを発生させ、プレゼンターにそれをサブスクライブさせます。次に、プレゼンターはテキストをフォーマットし、ビューにタイトルを設定できます。プレゼンターはビューのプレゼンテーションを担当し、ビューは単にものをレンダリングします。このように、ビューはまったくロジックがほとんどなく、本当にばかげています。これは、単体テスト中に嘲笑されるのに役立ち、プレゼンターのテストが非常に簡単になります。

また、フォーマット ロジックがデリゲート プロパティを介してプレゼンターにも挿入されていることにも注目してください。これにより、フォーマットがプレゼンターから切り離され、変更およびテストが可能になります。とにかくそれを行う1つの方法...私はこのアプローチが好きです。

public class Presenter
{
   private IView _view;
   private IModel _model;

   public Func<string, string> TitleFormatter { get; set; }

   public Presenter(IView view, IModel model)
   {
      _model = model;
      _view = view;

      _view.OnSetTitle += (s, e) => {
          _view.Title = TitleFormatter(e.Text);
       };
   }
}

public View : IView
{
    public event EventHandler<TitleChangedEventArgs> TitleChanged;

    public SomeUserActionEvent(object sender, SomeUserInterfaceEventArgs e)
    {
       TitleChanged(e.Text);
    }
}
于 2011-09-30T12:50:29.290 に答える