2013-10-02 41 views
0

我正試圖在Button中切換ControlTemplate在代碼中更改模板後,樣式中的觸發模板無法正常工作

<Style TargetType="Button"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=TestProperty}" Value="true"> 
       <Setter Property="Template" Value="{StaticResource MyCustomTemplate}"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

它工作正常,直到我更改代碼中的按鈕模板。例如,

myButton.Template = someTemplate; 

即使這是足夠多的重現了一個錯誤:

myButton.Template = myButton.Template; 

順便說下面的代碼將正確地更改myButton foregound到Aqua。這意味着觸發器工作正常。它只是不能設置模板

<Style TargetType="Button"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=TestProperty}" Value="true"> 
      <Setter Property="Template" Value="{StaticResource MyCustomTemplate}"/> 
      <Setter Property="Foreground" Value="Aqua"></Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

爲什麼會發生這種情況?

+0

你還設置了按鈕本身的模板? – Nitin

+0

按鈕有其默認模板。而不設置'myButton.Template = myButton.Template'觸發器工作正常。 –

+0

如果您直接設置myButton.Template(作爲本地值),則樣式值不能覆蓋此值。請參見[依賴屬性值優先級](http://msdn.microsoft.com/en-us/library/ms743230.aspx#listing)。 – LPL

回答

0

正如在問題的評論中提到的那樣,使用MVVM並在代碼背後更改控件是一個糟糕的主意。

你的行爲應該定義一個布爾連接屬性,我們稱之爲IsInEditMode。然後,不是直接設置模板,而是將附加屬性的值設置爲true。在您的樣式/模板中,根據IsInEditMode的值添加觸發器來更改模板(或設置模板部分的可見性)。

這種方式,你將不得不作出反應特性的所有組合的能力(IsInEditMode && TestProperty; IsInEditMode && !TestProperty;等等)

此外,你就可以使用其他控件的行爲。