2012-05-24 10 views
5

d:DataContextを使用するとDataContextの設計時データを簡単に提供できますが、{TemplateBinding}または{RelativeSource TemplatedParent}からStyle.Templateに参照される制御プロパティはどうなりますか?ControlTemplateの設計時データ

DesignerProperties.GetIsInDesignMode(this)がtrueを返すと、コンストラクタ/ロードされたイベント内のサンプルデータをコントロールに取り込むだけでよいですか? (通常のデザインエクスペリエンスを損なう可能性があるため、これを行うことはできません)

私が変更できないサードパーティコントロールについてはどうですか?私は通常のような何か、私自身のコントロールのために

答えて

2

「FooDesignTimeDataは」(自分のランタイムビューモデルからインタフェースを適切な形で設計時のデータを提供するクラス実装され
<Style x:Key="FooStyle> 
    <Setter Property="Template> 
    <Setter.Value> 
     <ControlTemplate TargetType="FooControl"> 
     <Grid d:DataContext="{d:DesignInstance FooDesignTimeData, IsDesignTimeCreatable=True}"> 
      ... guts of control template go here ... 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

は良い習慣ですここに)。

これは第三者のコントロールでもうまくいかない理由はわかりません。コントロールを再表現する必要さえないかもしれません - あなたのスタイルの中にサードパーティのコントロールを指定して、上記のようにデザイン時のデータコンテキストを与えるだけでなくなるかもしれませんが、私はそのシナリオを試していません。私はVendor.Controls.Design.dllやVendor.Controls.Expression.Designを提供するなど、素晴らしい設計時間の経験がないコントロールを使用しなければならないため、このようなトラブルに陥っていると思います。 dllファイル)。

TemplateBindingsを使用するには、すばらしい解決策はありません。私は通常私のコントロールを表示し、私は周りのテンプレートを切り替えることができますテストページを作成します。統合中には、必要に応じてコントロールのインスタンスを作成したり操作したりできる追加のビュー(アプリ内または別のアプリケーションとして)があります。 Blend SDKのGoToStateActionターゲットトリガーアクションは、ここではしばしば役に立ちます。たとえば、ビジュアルステートごとにボタンを作成し、「クリック」を使用して特定のステートへの遷移をトリガーします。したがって、テストデータにバインドされている間に、すべての状態と遷移を簡単にテストできます。ハッキーと実際に時間のデータを設計するのではなく、それは動作します。

+0

'{Binding}'は 'd:DataContext'のために簡単ですが、' {TemplateBinding} 'の後ろです。 –

+0

上記の作業を試しましたが、スタイルの一部としてd:DataContextを割り当てましたか?私はこの状況のた​​めの素晴らしい解決策はありません:通常私は自分のコントロールを表示し、テンプレートを切り替えることができますテストページを作成します。ハッキーだが、うまくいく。 –

+0

これは妥当と思われます。これを自分で試してみてください。しかし、統合バージョンのXAMLを変更する必要がありますか、バインディングを提供することはできますか? –

関連する問題