2012-05-24 32 views
5

提供了設計時數據的DataContext設計時數據是容易使用的d:DataContext但如何從Style.Template{TemplateBinding}{RelativeSource TemplatedParent}引用的控件的屬性?的控件模板

我應該在構造函數/加載事件中使用示例數據填充控件時 DesignerProperties.GetIsInDesignMode(this)返回true嗎? (不能這樣做,因爲它會破壞正常的設計體驗)。

那我不能修改的第三方控件呢?

回答

2

對於我自己控制,我通常做類似:

<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> 

其中「FooDesignTimeData」的是,在適當的形式提供設計時數據的類(實現從你的運行視圖模型的接口是一個很好的做法這裏)。

我不明白爲什麼這也不適用於第三方控制。您甚至可能不需要重新設計控件 - 只需在樣式中指定第三方控件併爲其設計時間數據上下文(如上所述)即可,但我沒有嘗試過這種方案。我認爲你會遇到所有這些麻煩,因爲你不得不使用一個沒有很好的設計時間體驗的控件(比如通過提供一個Vendor.Controls.Design.dll或Vendor.Controls.Expression.Design。 dll文件)。

要使用TemplateBindings,我沒有一個很好的解決方案。通常我會創建一個測試頁面來顯示我的控件,並允許我切換模板。在整合過程中,您將看到額外的視圖(無論是在您的應用程序中還是作爲單獨的應用程序),允許您根據需要創建和操作控件的實例。 GoToStateAction從Blend SDK定位的觸發器操作在這裏通常很有用。例如,爲每個可視狀態創建一個按鈕,然後使用Click甚至觸發到特定狀態的轉換。因此,您可以輕鬆測試所有狀態以及綁定到測試數據時的轉換。 Hacky並沒有真正設計時間數據,但它工作。

+0

正如我所說'{Binding}'很容易因爲'd:DataContext',但我在'TemplateBinding}之後。 –

+0

您是否嘗試過上述操作,但將d:DataContext分配爲樣式的一部分?對於這種情況,我沒有很好的解決方案:通常我會創建一個測試頁面來顯示我的控件,並允許我切換模板。哈克,但它的作品。 –

+0

這似乎是合理的。必須自己嘗試。但是您必須更改集成版本的XAML,或者您也可以在那裏提供綁定? –