2011-02-07 9 views
4

私は、抽象基本クラス(UserControlに基づく)を継承するいくつかのWPFユーザーコントロールを持つプロジェクトに取り組んでいます。これらのコントロールは、実行時にうまくレンダリングされますが、デザイナではレンダリングされません。デザイン時に抽象基本クラスを使用してユーザーコントロールをレンダリングする

これは、デザイナーがxamlルート要素のインスタンス(この場合は基本クラス)を作成しようとしたために発生しますが、抽象インスタンスであるためインスタンスを作成できません。

レコードの場合、WPFでこのタイプのコントロール階層を持つ「patterns & practice」タイプの問題があることはわかっていますが、プロジェクト全体のリファクタリングは現在オプションではありません。

私の質問はこれです:DataContext、DesignWidthなどを設定するためのデザインタイム属性があることは知っています。私が思っているのは、「デザインタイム」インスタンスまたはタイプを置き換えとして提供することができますか?コントロールがデザイナーに読み込まれたら?

答えて

0

デザインタイムVisual Studioは、ユーザーコントロール の新しいインスタントをパラメータレスコンストラクタで作成しようとします。この

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

デザイナーのような

あなたはユーザーコントロールを作成することができない場合は、インスタントはレンダリングに失敗します。

YourUserControlにパラメータが必要な場合。最も人気のあるトリックは、この

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

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

のようにささげるコンストラクタを作成するために、MVVMパターンでは、いくつかの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; 
     //... 
    } 
関連する問題