2009-05-25 35 views

回答

238

使用MultiDataTrigger

<Style TargetType="ListBoxItem"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=State}" Value="WA"> 
     <Setter Property="Foreground" Value="Red" /> 
     </DataTrigger>  
     <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding Path=Name}" Value="Portland" /> 
      <Condition Binding="{Binding Path=State}" Value="OR" /> 
     </MultiDataTrigger.Conditions> 
     <Setter Property="Background" Value="Cyan" /> 
     </MultiDataTrigger> 
    </Style.Triggers> 
    </Style> 
+20

定義有沒有辦法做到在multiTrigger一個「OR」語句。例如名稱=「波特蘭」或狀態=「或」 – jasonk 2010-06-28 21:28:22

+10

@jasonk - 不知道你是否可以用MultiTrigger做到這一點。你可以爲它定義兩個觸發器。 – Gishu 2010-06-29 05:40:22

+0

如果它是一個簡單的OR條件語句,你可以反轉邏輯,使它變成AND。 | condition1 | condition2 |結果| | true | true | true | | true | false | true | | false | true | true | | false | false | false | 而不是檢查/ OR是否爲真,檢查兩個/ AND是否爲false,並將默認值設置爲true。 – 2014-10-28 15:47:28

39

@jasonk - 如果你想擁有 「或」 否定再因爲所有條件(A和B)< =>〜(〜A或〜B)

但如果你有其他的值不是布爾嘗試使用的類型轉換器:

<MultiDataTrigger.Conditions> 
    <Condition Value="True"> 
     <Condition.Binding> 
      <MultiBinding Converter="{StaticResource conditionConverter}"> 
       <Binding Path="Name" /> 
       <Binding Path="State" /> 
      </MultiBinding> 
     </Condition.Binding> 
     <Setter Property="Background" Value="Cyan" /> 
    </Condition> 
</MultiDataTrigger.Conditions> 

可以使用值轉換方法,你想生產出適合你的條件的任何方式。

14

詳細說明@serine's answer並說明如何處理非平凡的多值條件:我需要在布爾條件NOT a AND (b OR NOT c)的條目上顯示「暗淡」覆蓋圖。

對於背景,這是一個「多選」問題。如果用戶選擇了錯誤的答案,它將變爲已禁用(變暗,無法再次選擇)。一個自動代理有能力重點在任何特定的選擇給予解釋(邊框突出顯示)。當代理人專注於某個物品時,即使該物品已被禁用,也不應將其變暗。所有未聚焦的項目都標記爲不重點,應該變暗。

調光的邏輯是這樣的:

NOT IsFocused AND (IsDefocused OR NOT Enabled)

爲了實現這個邏輯,我做了一個通用的IMultiValueConverter命名(尷尬),以

// 'P' represents a parenthesis 
//  ! a && (b || ! c) 
class NOT_a_AND_P_b_OR_NOT_c_P : IMultiValueConverter 
{ 
    // redacted [...] for brevity 
    public object Convert(object[] values, ...) 
    { 
     bool a = System.Convert.ToBoolean(values[0]); 
     bool b = System.Convert.ToBoolean(values[1]); 
     bool c = System.Convert.ToBoolean(values[2]); 

     return !a && (b || !c); 
    } 
    ... 
} 

符合我的邏輯在XAML我在MultiDataTrigger<Style><Style.Triggers>資源

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <!-- when the equation is TRUE ... --> 
     <Condition Value="True"> 
      <Condition.Binding> 
       <MultiBinding Converter="{StaticResource NOT_a_AND_P_b_OR_NOT_c_P}"> 
        <!-- NOT IsFocus AND (IsDefocused OR NOT Enabled) --> 
        <Binding Path="IsFocus"/> 
        <Binding Path="IsDefocused" /> 
        <Binding Path="Enabled" /> 
       </MultiBinding> 
      </Condition.Binding> 
     </Condition> 
    </MultiDataTrigger.Conditions> 
    <MultiDataTrigger.Setters> 
     <!-- ... show the 'dim-out' overlay --> 
     <Setter Property="Visibility" Value="Visible" /> 
    </MultiDataTrigger.Setters> 
</MultiDataTrigger> 

而對完整性的緣故,我的轉換器在ResourceDictionary

<ResourceDictionary xmlns:conv="clr-namespace:My.Converters" ...> 
    <conv:NOT_a_AND_P_b_OR_NOT_c_P x:Key="NOT_a_AND_P_b_OR_NOT_c_P" /> 
</ResourceDictionary> 
相關問題