2

ビューからプレゼンターにフィールド値を公開するために MVP パターンを使用しています。ビューに を追加し、プレゼンターからエラーを追加したいErrorProviderのですが、それは自分のコントロールを公開することを意味します。これは私がやりたくないことです。私の解決策ExposableControlValueは、値を一般的に公開し、関数を追加したクラスを作成することCreateError(string errorMessage)でした。

public interface IExposableControlValue<T>
{

  T Value { get; set; }

  void CreateError(string errorMessage);

  void ClearErrors();

}

私の考えでは、 をProperty参照渡しすると、ジェネリック値は基本的にControlのバッキング フィールドを指すようになります。すべてのErrorProviderロジックはビュー側で処理でき、すべてのエラー チェックはプレゼンターで処理できます。

明らかに、私がここにいるのはProperty、参照渡しができないためです。また、私が見たすべての例は、この例で解読できるほど私の状況に近いわけではありません。

T Get()それを行う方法があれば、メソッドを動的に設定しても問題Set(T value)ありませんが、要するに、クラスインスタンス内でそのプロパティを「ライブ」にすることを模倣したいと思います。

4

1 に答える 1

0

最終的にこれを希望のニーズに合わせることができたので、私は自分の質問に答えます。

工場のパターンを使って、新しい方法を作ることができましたCreateNew

  public IExposableControlValue<T> CreateNew<T>(ErrorProvider errorProvider, Control control, Func<T> get, Action<T> set) {
     var param1 = new ConstructorArgument("errorControl", errorProvider);
     var param2 = new ConstructorArgument("control", control);
     var exposableControlValue = resolutionRoot.Get<IExposableControlValue<T>>(param1, param2);
     exposableControlValue.CreateSet(set);
     exposableControlValue.CreateGet(get);

     return exposableControlValue;
  }

を使ってninjectいますが、コンセプトは同じです。基本的に、このクラスの新しいインスタンスを作成するために、いくつかの依存関係をユーザーに求めています。次に、内部のジェネリック値を実際に公開したい場合は、次のようにします。

  Func<T> get;

  Action<T> set;

  public ExposableControlValue(ErrorProvider errorControl, Control control) {
     ...configure my dependcies
  }

  public T Value { get { return get.Invoke(); } set { set.Invoke(value); } }

最後に、ファクトリCreateNewメソッドを実際に使用するときに、必要なプロパティに応じていくつかの引数を渡します。

 _forSomethingBackingField = exposableControlFactory.CreateNew<decimal>(errorProvider, numericUpDownForSomething, 
        () => { return numericUpDownForSomething.Value; }, (decimal d) => { numericUpDownForSomething.Value = d; });

は、に対するdecimal私の一般的な値ですnumeric up down。でこれを行いたい場合はstring、単にstringジェネリック引数として を使用(string s) = > someControlWithTextProperty.Text = sし、匿名メソッド param に渡します。もちろん、そうすることで、使用しているプロパティが実際に渡すタイプであることを確認する必要があります。

于 2015-10-02T03:08:45.130 に答える