2015-10-02 2 views
1

J'utilise un modèle MVP pour exposer les valeurs de champ de ma vue à mon présentateur. Je voudrais ajouter un ErrorProvider à ma vue et ajouter les erreurs du Presenter, mais cela signifierait exposer mes contrôles, ce que je ne tiens pas à faire. Ma solution impliquait la création d'une classe ExposableControlValue qui expose une valeur génériquement et qui a la fonction ajoutée CreateError(string errorMessage).MVP Propriété ErrorControl

public interface IExposableControlValue<T> 
{ 

    T Value { get; set; } 

    void CreateError(string errorMessage); 

    void ClearErrors(); 

} 

Ma pensée était, je vais passer dans le Property par référence et maintenant ma valeur générique soulignerai essentiellement au champ de support de Control. Toute la logique ErrorProvider peut être gérée côté View et toute la vérification des erreurs peut être gérée par le présentateur. De toute évidence, je suis ici parce que vous ne pouvez pas passer le Property par référence, et tous les exemples que j'ai vus ne sont pas assez proches de ma situation que je peux les déchiffrer pour cet exemple. J'aurais aussi bien définir les méthodes T Get(), Set(T value) dynamiquement s'il y avait un moyen de le faire, mais en résumé, je voudrais imiter avoir cette propriété 'live' dans mon instance de classe.

Répondre

0

Je vais répondre à ma propre question car j'ai finalement pu travailler à mes besoins.

L'utilisation d'un modèle d'usine, j'ai pu faire une nouvelle méthode 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; 
    } 

J'utilise ninject, mais le concept est le même. Essentiellement, je demande à l'utilisateur quelques dépendances pour créer une nouvelle instance de cette classe. Puis, quand je veux exposer réellement la valeur générique intérieure, je le fais comme ceci:

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

Enfin, quand je l'utilise en fait la méthode usine CreateNew, je passe quelques arguments en fonction de la propriété que j'ai besoin

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

La decimal est ma valeur générique pour le numeric up down. Si vous voulez le faire avec un string, vous utiliserez simplement string comme argument générique et passerez (string s) = > someControlWithTextProperty.Text = s à la méthode anonyme param. Bien sûr, ce faisant, vous voudrez vous assurer que la Propriété que vous utilisez est réellement du type que vous transmettez.