2010-03-30 9 views
14

Estoy armando un patrón de MVP liviano para un proyecto de WinForms. Todo compila y funciona bien. Sin embargo, cuando intento abrir WinForm en modo de diseño en Visual Studio aparece un error "Caracteres ilegales en la ruta". Mi WinForm usa genéricos y hereda de una clase de formulario base. ¿Hay algún problema con el uso de genéricos en WinForm?"Caracteres no válidos en la ruta". Visual Studio WinForm Design View

Aquí está el WinForm y la clase de formulario base. forma

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í, el diseñador no admite formularios base genéricos. Probablemente no llegaste tan lejos, supongo que está muriendo en una excepción porque no verificas la propiedad DesignMode en el código que se ejecuta en el diseñador (constructor, evento de carga). –

Respuesta

12

This post helped answer my question.

Al parecer, esta limitación en Visual Studio. Pude solucionar el problema al tener una clase intermediaria que definía los valores genéricos. Es un realmente feo trabajo alrededor de, pero ahora puedo abrir el formulario en Visual Studio.

Aquí está mi clase intermediaria, que tiene que estar en un archivo separado, o DESPUÉS de la definición de clase de formulario. También debe tener un constructor por defecto, implícita o explícita:

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

Luego, en mi forma real que heredan de 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

Creo que se corrigió en VS 2015 Actualización 1. Funciona bien aquí después de instalar la actualización. – Jerther

+0

Ah, olvídalo, a veces todavía no funcionará si el genérico está definido en algún classe personalizado. – Jerther

Cuestiones relacionadas