2011-09-22 58 views
3

我確信之前已經詢問過這個問題,但我沒有簡單的時間來搞清楚如何對查詢進行短語處理。樣式觸發器以應用另一種樣式

我有這種風格;

<SolidColorBrush x:Key="SemiTransparentRedBrushKey">#F0FF0000</SolidColorBrush> 
<Style x:Key="TextBoxEmptyError" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="0"> 
      <Setter Property="BorderBrush" Value="{StaticResource ResourceKey=SemiTransparentRedBrushKey}"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

我可以適用於文本框,當它們爲空時有紅色邊框。它很棒,我可以在控制標籤上添加Style="{StaticResource TextBoxEmptyError}"。但是,如果我想將這種風格應用於觸發器,那麼控件僅在特定條件下使用它(如綁定爲真)呢?喜歡的東西:

<TextBox.Style> 
<Style TargetType="TextBox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=ApprovedRequired}" Value="True"> 
      <Setter Property="Style" Value="{StaticResource TextBoxEmptyError}"></Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

此代碼拋出雖然{"Style object is not allowed to affect the Style property of the object to which it applies."}

的異常可以像這樣做呢?

編輯:如果不能使用伴奏觸發器來完成,因爲它會覆蓋本身,有沒有有條件應用資源風格的另一種方式?

編輯:如果有更適合此操作的術語,我可以更改問題標題。

+0

你有沒有考慮過使用'Validation.ErrorTemplate'?請參閱:http://wpftutorial.net/DataValidation.html – CodingGorilla

+0

是的,但我確定對於我正在使用的一些表單來說這太過分了。這個問題的答案也將更適用於風格的使用,而不僅僅是我的紅色錯誤邊框。 – Tyrsius

回答

4

樣式不能從樣式中的Setter中設置,因爲基本上第一個樣式根本不會存在。

既然你正在尋找一個驗證的風格,我會建議尋找到Validation.ErrorTemplate,但如果不工作,你可以改變你的觸發器,它修改特定的屬性,如,而不是風格屬性BorderBrush

+0

我知道我給了一個特定的實例,但我想在問題中有一些代碼。還有一些情況會使用非錯誤相關的樣式(如粗體)。我可以在每個控件中重新創建它們,但這似乎打破了DRY原則。我以後想如何更新風格?每個控件都會將其觸發器綁定到不同的屬性,因此每個控件樣式設置器都需要單獨更新,即使它們都是相同的。 – Tyrsius

+0

+1「風格不能從風格中的二傳手設置」 - 我甚至沒有注意到我錯誤地做了這個。 –

0

我會想到使用TemplateTrigger的模板,在那裏你可以根據以往的條件改變風格到什麼狀態