2012-04-18 15 views
6

używam część kodu XAML z którego jestDataTrigger Korzystanie z więcej niż jednej wartości w WPF

<DataTrigger Binding="{Binding Path=Name}" Value="1"> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Course Text"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding Path=Name}" Value="2"> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Media Lecture"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding Path=Name}" Value="3"> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/> 

<DataTrigger Binding="{Binding Path=Name}" Value="4"> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Question"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding Path=Name}" Value="5"> 
    <Setter Property="Header" TargetName="expanderHeader" Value="General"/> 
</DataTrigger> 

Teraz chcę użyć DataTrigger które mogą mieć wartości jak 3, 301, 302 lub 303. W jaki sposób można Robię to. Próbowałem z Multidatatriggerem, ale to nie zadziałało. Kod Próbowałem z Multidatatrigger było:

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Path=Name}" Value="301"/> 
     <Condition Binding="{Binding Path=Name}" Value="301"/> 
     <Condition Binding="{Binding Path=Name}" Value="302"/> 
     <Condition Binding="{Binding Path=Name}" Value="303"/> 
     </MultiDataTrigger.Conditions> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/> 
</MultiDataTrigger> 
+0

Wat chcesz osiągnąć spust danych? – Akanksha

+0

@ user1341006 W jaki sposób własność "Nazwa" może mieć 5 różnych wartości w tym samym czasie? – Ankesh

Odpowiedz

9

MultiDataTrigger stosuje się, gdy wszystko warunków są spełnione nie dowolny, dlatego Twój MultiDataTrigger nie działa.

Albo mieć cztery oddzielne wyzwalaczy, lub umieścić warunek do osobnego właściwości Boolean takich jak

bool ShowAssessment 
{ 
    return Value == 301 || Value == 302 ... 
} 

podnieść powiadomienie o zmianie właściwość dla ShowAssessment gdy wartość zmienia

np

int Value { 
    get{ return _value; } 
    set { 
     _value = value; 
     RaisePropertyChanged("Value"); 
     RaisePropertyChanged("ShowAssessment"); 
    } 
} 

a następnie wyzwalacz w ShowAssessment.

Prawdopodobnie lepszym rozwiązaniem jest dodanie właściwości HeaderText za pomocą instrukcji switch, która zwraca poprawny tekst nagłówka na podstawie Value. Następnie po prostu przyklej tekst nagłówka do tego. Nie są wymagane żadne wyzwalacze.

+0

Chcę, aby wyzwalacz został zastosowany, gdy spełniona jest którakolwiek z wartości. Chcę tylko w jednym wyzwalaczu bez użycia czterech wyzwalaczy. – Jaguar

+0

Istnieje kilka rozwiązań w mojej odpowiedzi. Jeden wyzwalacz dla czterech wartości lub brak wyzwalaczy poprzez przeniesienie logiki do modelu widoku. – Phil

0

MultidataTrigger zadziała, gdy wszystkie warunki zostaną spełnione. Więc

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Path=Prop1}" Value="301"/> 
     <Condition Binding="{Binding Path=Prop2}" Value="301"/> 
     <Condition Binding="{Binding Path=Prop3}" Value="302"/> 
     <Condition Binding="{Binding Path=Prop4}" Value="303"/> 
    </MultiDataTrigger.Conditions> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/> 
</MultiDataTrigger> 

Będzie wymagać jednego DataTrigger

<DataTrigger Binding="{Binding Path=ConditionEnum}" Value="1"> 
    <Setter Property="Header" TargetName="expanderHeader" Value="Course Text"/> 
</DataTrigger> 

ustawić wartość wyliczenia o określonej logiki w kodzie ...

Przykład:

Validate() 
{ 
    if(Value == 301 || Value == 302|| ....) 
    { 
     ConditionEnum = MyEnum.Assessment; 
    } 
    //Other Conditions 
} 

Opuszczam implementację INotifyPropertyChanged. Użyj go, aby dostarczyć powiadomienia o zmianach.

+0

Chcę go na wypadek, gdyby wartość była równa 3, 301, 302 lub 303. Jak mogę to zrobić? – Jaguar

Powiązane problemy