2009-05-25 11 views

cevap

238

Kullanım MultiDataTrigger tip

<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

tanımlanan multiTrigger bir "VEYA" deyimi yapmanın bir yolu var mı. Örneğin. name = "portland" VEYA state = "OR" – jasonk

+10

@jasonk - Bunu bir MultiTrigger ile yapabileceğinizden emin değilsiniz. Bunun için iki tetikleyici tanımlayabilirsiniz .. – Gishu

+0

Eğer basit bir OR koşulu ifadesiyse, mantığı tersine çevirip bir AND'ye dönüştürebilirsiniz. | condition1 | condition2 | sonuç | | true | true | doğru | | true | false | doğru | | false | true | doğru | | false | false | yanlış |/OR öğesinin doğru olup olmadığını denetlemek yerine , her iki/AND öğesinin yanlış olup olmadığını kontrol edin ve varsayılan değeri true olarak ayarlayın. –

39

@jasonk - Sahip "veya" o zamandan beri bütün şartları (A ve B) < => ~ (~ A veya ~ B)

olumsuzlamak istiyorsanız ancak diğer değerleri varsa boole daha tip dönüştürücüler kullanarak deneyin:

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

Eğer dönüştürme yönteminde size uygun bir koşulu üretmek için istediğiniz şekilde değerleri kullanabilirsiniz.

+1

Ah, her şeyi etkisiz hale getirmek ve bir OR koşuluna çevirmek için akıllı hareket :) –

+5

Bu yanıtı biraz genişletebilir misiniz? Nasıl kullanacağımı bilmiyorum. 'ConditionConverter' ne yapar?Bu örnekte "Portland" ve "OR" kelimelerini bizim iki 'veya' seçeneklerimiz olarak nasıl belirliyoruz? – DLeh

+0

@DLeh - [MultiBinding] kullanımı hakkında [İyi bir öğretici] (http://tech.pro/tutorial/809/wpf-tutorial-using-multibindings). – cod3monk3y

14

@serine's answer ürününü ayrıntılı olarak incelemek ve önemsiz çok değerli koşuluyla çalışmayı göstermek için: NOT a AND (b OR NOT c) boolean koşulu için bir öğenin üzerinde "karartma" kaplaması göstermeye ihtiyacım vardı.

Arka plan için bu "Çoktan Seçmeli" sorudur. Kullanıcı yanlış bir cevap alırsa devre dışı olur (kararır ve tekrar seçilemez). Otomatik bir aracı, bir açıklama vermek için herhangi bir seçim üzerinde odak odaklanma yeteneğine sahiptir (vurgulanan kenarlık). Aracı bir öğeye odaklandığında, devre dışı bırakılmış olsa bile soluk olmamalıdır. Odaklanmayan tüm öğeler işaretsiz işaretlenir ve soluk olmalıdır.

karartma için mantık böylece:

NOT IsFocused AND (IsDefocused OR NOT Enabled)

bu mantığı uygulamak için, bir jenerik IMultiValueConverter XAML olarak benim üzerinde lojik

// '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); 
    } 
    ... 
} 

maç için (beceriksizce) adında yapılan Bunu, bir MultiDataTrigger<Style><Style.Triggers> kaynağında kullanıyorum

Ve bütünlüğü uğruna

<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> 
, benim dönüştürücü bir 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> 
+7

Bunun, bu şekilde kullanılacak dönüştürücülerin amacı olduğunu sanmıyorum. Gerçekten de, değerleri gösterim için dönüştürmek içindir. Bu karmaşık hale geldiğinde, size ihtiyacınız olanı veren görünüm modelinde hesaplanmış bir özellik oluşturun. –

+5

Bu adlandırma –

+2

Lütfen programlamanın bir zanaat olduğunu ve kodun zarif olduğunu hatırlamak için bir sessizlik anı yakalayın. –