2010-03-30 2 views
14

WinForms 프로젝트를위한 간단한 MVP 패턴을 정리하고 있습니다. 모든 것이 잘 컴파일되고 실행됩니다. 그러나 Visual Studio에서 디자인 모드로 WinForm을 열려고하면 "잘못된 문자가있는 경로"오류가 발생합니다. 내 WinForm은 제네릭을 사용하고 기본 Form 클래스에서 상속합니다. WinForm에서 제네릭을 사용하는 데 문제가 있습니까?"경로에 잘못된 문자가 있습니다." Visual Studio WinForm 디자인보기

다음은 WinForm 및 기본 Form 클래스입니다.

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

자료 양식 MvpForm : Visual Studio에서

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

예, 디자이너는 일반 기본 양식을 지원하지 않습니다. 당신은 아마도 그렇게 멀리하지 않았다. 디자이너 (생성자, Load 이벤트)에서 실행되는 코드에서 DesignMode 속성을 확인하지 않았기 때문에 예외로 인해 죽어 가고있는 것 같다. –

답변

12

This post helped answer my question.

분명히이 제한. 일반 값을 정의한 중개 클래스를 사용하여이 문제를 해결할 수있었습니다. 주위에서 정말 못생긴 일이지만, 이제 Visual Studio에서 양식을 열 수 있습니다.

여기 내 중간 클래스입니다.이 클래스는 별도의 파일이거나 양식 클래스 정의 이후에 있어야합니다.

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

그런 다음 내 실제 형태로 내가 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

VS 2015 업데이트 1에서 수정 된 것 같습니다. 업데이트를 설치 한 후 여기에서 올바르게 작동합니다. – Jerther

+0

아, 잊어 버려요. 가끔 범용이 일부 사용자 정의 클래스에 정의되어 있으면 여전히 작동하지 않습니다. – Jerther

관련 문제