2010-03-30 11 views
14

Sto assemblando un pattern MVP leggero per un progetto WinForms. Tutto si compila e funziona bene. Tuttavia, quando tento di aprire WinForm in modalità progettazione in Visual Studio ottengo un errore "caratteri non validi nel percorso". Il mio WinForm utilizza i generici e eredita da una classe Form base. C'è un problema con l'utilizzo di generici in un WinForm?"Caratteri non ammessi nel percorso". Visual Studio WinForm Design View

Ecco la classe WinForm e base Form. modulo

public partial class TapsForm : MvpForm<TapsPresenter, TapsFormModel>, ITapsView 
{ 
    public TapsForm() 
    { 
     InitializeComponent(); 
    } 

    public TapsForm(TapsPresenter presenter) 
     :base(presenter) 
    { 
     InitializeComponent(); 
     UpdateModel(); 
    } 

    public IList<Taps> Taps 
    { 
     set { gridTaps.DataSource = value; } 
    } 

    private void UpdateModel() 
    { 
     Model.RideId = Int32.Parse(cboRide.Text); 
     Model.Latitude = Double.Parse(txtLatitude.Text); 
     Model.Longitude = Double.Parse(txtLongitude.Text); 
    } 
} 

Base MvpForm:

public class MvpForm<TPresenter, TModel> : Form, IView 
    where TPresenter : class, IPresenter 
    where TModel : class, new() 
{ 
    private readonly TPresenter presenter; 
    private TModel model; 

    public MvpForm() 
    { 
    } 

    public MvpForm(TPresenter presenter) 
    { 
     this.presenter = presenter; 
     this.presenter.RegisterView(this); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     if (presenter != null) 
      presenter.IntializeView(); 
    } 

    public TModel Model 
    { 
     get 
     { 
      if (model == null) 
       throw new InvalidOperationException("The Model property is currently null, however it should have been automatically initialized by the presenter. This most likely indicates that no presenter was bound to the control. Check your presenter bindings."); 

      return model; 
     } 
     set { model = value;} 
    } 
} 
+1

Sì, il progettista non supporta i moduli di base generici. Probabilmente non sei arrivato così lontano, immagino che stia morendo su un'eccezione perché non controlli la proprietà DesignMode nel codice che viene eseguito nella finestra di progettazione (costruttore, evento Load). –

risposta

12

This post helped answer my question.

quanto pare, questa una limitazione in Visual Studio. Sono stato in grado di aggirarlo avendo una classe intermedia che ha definito i valori generici. È un lavoro davvero brutto intorno a, ma ora posso aprire il modulo in Visual Studio.

Ecco la mia classe intermedia, che deve essere in un file separato o DOPO la definizione della classe del modulo. Deve inoltre avere un costruttore di default, implicita o esplicita:

public class MvpTapsForm : MvpForm<TapsPresenter, TapsFormModel> 
{ 
} 

Poi nella mia forma attuale mi ereditano da MvpTapsForm.

public partial class TapsForm : MvpTapsForm, ITapsView 
{ 
    public TapsForm() 
    { 
     InitializeComponent(); 
    } 

    public TapsForm(TapsPresenter presenter) 
     : base(presenter) 
    { 
     InitializeComponent(); 
     UpdateModel(); 
    } 

    public IList<Taps> Taps 
    { 
     set { gridTaps.DataSource = value; } 
    } 

    private void UpdateModel() 
    { 
     Model.RideId = Int32.Parse(cboRide.Text); 
     Model.Latitude = Double.Parse(txtLatitude.Text); 
     Model.Longitude = Double.Parse(txtLongitude.Text); 
    } 
} 
+0

Penso che sia stato risolto in VS 2015 Update 1. Funziona bene qui dopo aver installato l'aggiornamento. – Jerther

+0

Ah, dimenticalo, a volte non funziona ancora se il generico è definito su una classe personalizzata. – Jerther

Problemi correlati