2

我正在使用 MVP 模式将字段值从我的视图公开给我的演示者。我想ErrorProvider在我的视图中添加一个并添加来自 Presenter 的错误,但这意味着公开我的控件,而我并不热衷于这样做。我的解决方案涉及创建一个ExposableControlValue类,该类通常公开一个值并具有附加功能CreateError(string errorMessage)

public interface IExposableControlValue<T>
{

  T Value { get; set; }

  void CreateError(string errorMessage);

  void ClearErrors();

}

我的想法是,我将通过Property引用传递,现在我的通用值将基本上指向Control' 支持字段。所有的ErrorProvider逻辑都可以在 View 端处理,所有的错误检查都可以由 Presenter 处理。

显然,我在这里是因为您无法通过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,但概念是相同的。本质上,我要求用户提供一些依赖项来创建此类的新实例。然后,当我想真正公开内部 Generic 值时,我会这样做:

  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. 如果您想使用 a 来执行此操作string,您只需将string其用作通用参数并传递(string s) = > someControlWithTextProperty.Text = s给匿名方法参数即可。当然,这样做您需要确保您使用的属性实际上是您传递的类型。

于 2015-10-02T03:08:45.130 回答