2011-11-29 67 views
3

我有一個非常大的ControlTemplate(200多行),裏面有很多嵌套控件。我需要重新使用這個模板,對這些嵌套控件(複選框的可見性)進行一些小改動。很明顯,我不想複製粘貼到一個新的ControlTemplate中,只需進行更改,因爲我將雙倍的代碼庫,如果我對模板進行了常見更改,則需要更改兩者。覆蓋ControlTemplate中的屬性

我已經想到了三種解決方案看起來他們可以工作,但我不知道有足夠的瞭解XAML(尤其是重構XAML知道這些是可能的)

  1. 提取共同XAML到一個ControlTemplate的基礎中,並在兩個新的ControlTemplates中覆蓋複選框的可見性(由於我使用的是C#語言,我把重寫放在引號中 - 我不知道這在XAML中是否有意義!)

  2. 獲得訪問權限從ControlTemplate定義之外的複選框(通過x:Name或x:Key也許),然後設置Visibility將是微不足道的。

  3. 指定某種在ControlTemplate中的公開程度結合,是這樣的:(?這是什麼原因TemplateBinding用於)

    <Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/>

是否有任何的這些想法是否有效?如果是這樣,哪個最合適? (如果沒有 - 什麼是正確的方法?)

我使用VS2010與.Net 4.0。

回答

2

我會去#3。但是你用它不太合適。如果你想綁定到實際控件的屬性,在哪個模板上應用,你應該使用TemplateBinding。 假設您擁有一個屬性爲ShowCheckboxes的自定義控件。 然後在你的模板,你應該使用

<Checkbox Visibility={TemplateBinding ShowCheckboxes, Converter={StaticResource BooleanToVisibilityConverter}}/> 

注意,你必須引用或建立適當的轉換器。另一方面,如果您使用MVVM,則可以在viewmodel類上定義控件屬性。那麼你應該使用{Binding}

此外,還有另一種方法來控制應用哪些模板。 您可以從bug模板中爲您的子控件提取模板。並複製它,所以你有兩個模板,它們在你需要的方式上有所不同。 然後,在主模板中,您可以將TemplateSelector設置爲您的子控件的自定義類,您將實現該模板。有關更多示例,請參閱http://msdn.microsoft.com/ru-ru/library/system.windows.controls.datatemplateselector.aspx