2011-02-07 5 views
4

나는 (WPF 사용자 컨트롤을 기반으로하는) 추상 기본 클래스를 상속하는 여러 WPF 사용자 정의 컨트롤이있는 프로젝트에서 작업하고 있습니다. 이러한 컨트롤은 런타임에 잘 렌더링되지만 디자이너에서는 렌더링되지 않습니다.디자인 타임에 추상 기본 클래스를 사용하여 렌더링 사용자 컨트롤

디자이너가 xaml 루트 요소의 인스턴스 (이 경우에는 기본 클래스)를 만들려고 시도하기 때문에이 문제가 발생하지만 추상 클래스이므로 인스턴스를 만들 수 없습니다.

레코드의 경우 WPF에서이 유형의 컨트롤 계층 구조를 갖는 "패턴 & 사례"유형 문제가 있지만 전체 프로젝트 리팩터링은 현재 옵션이 아니라는 것을 알고 있습니다.

내 질문은 : 나는 DataContext, DesignWidth 등을 설정하기위한 디자인 타임 속성이 있다는 것을 알고 있습니다. 궁금한 점은 "디자인 타임"인스턴스 나 유형을 대체품으로 제공 할 수 있습니까? 컨트롤이 디자이너에로드 될 때?

답변

0

디자인 타임에 Visual Studio는 사용자 컨트롤 의 새 인스턴스를 매개 변수없는 생성자으로 만들려고합니다. 이

var myView = new MyUserControl(); //no params 

디자이너 같은

당신은 UserControl을 작성할 수없는 경우 즉시 렌더링되지 않습니다. YourUserControl에 매개 변수가 필요한 경우

가장 인기 비결은 MVVM 패턴이

public MyUserControl() : 
    this(new MockViewModel(), new MockDataContext){ } // mock Designtime constructor 

puclic MyUserControl(IViewModel vm, IDataContext context) //runtime constructor 
{ 
} 

같은 헌정 생성자를 만드는 것입니다 일부 UserControl.DataContext는 일부 XAML

<UserControl.DataContext> 
    <local:MyViewModel /> 
</UserControl.DataContext> 

당신은 매개 변수가없는 생성자를 정의해야합니다 PARAMS 필요한 사용자 정의 형이다 디자인 타임 환경.

public MyViewModel() : this(new MockEventAggregator()) //for designtime 
    { } 

    [ImportingConstructor] 
    public MyViewModel(IEventAggregator eventAggregator) //for runtime 
    { 
     this._eventAggregator = eventAggregator; 
     //... 
    } 
관련 문제