Использование DataTrigger с несколькими значениями в WPF
Я использую код XAML, частью которого является
<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>
теперь я хочу использовать dataTrigger, который может иметь значения 3, 301, 302 или 303. Как я могу это сделать? Я пробовал с Multidatatrigger, но это не сработало. Код, который я пробовал с Multidatatrigger, был:
<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>
2 ответов
MultiDataTrigger применяется, когда все условия выполнены не любой, вот почему ваш MultiDataTrigger не работает.
либо имеют четыре отдельных триггера, либо помещают условие в отдельное логическое свойство, такое как
bool ShowAssessment
{
return Value == 301 || Value == 302 ...
}
поднимите уведомление об изменении свойства для ShowAssessment при изменении значения
Эл.г
int Value {
get{ return _value; }
set {
_value = value;
RaisePropertyChanged("Value");
RaisePropertyChanged("ShowAssessment");
}
}
и затем триггер на ShowAssessment.
- наверное, лучше решение состоит в том, чтобы добавить свойство HeaderText с оператором switch, который возвращает правильный текст заголовка на основе Value
. Затем просто привяжите текст заголовка к этому. Никаких триггеров не требуется.
MultidataTrigger будет действовать, когда все условия удовлетворены . Так что
<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>
вам потребуется один DataTrigger
<DataTrigger Binding="{Binding Path=ConditionEnum}" Value="1">
<Setter Property="Header" TargetName="expanderHeader" Value="Course Text"/>
</DataTrigger>
задайте значение перечисления с определенной логикой в коде...
пример :
Validate()
{
if(Value == 301 || Value == 302|| ....)
{
ConditionEnum = MyEnum.Assessment;
}
//Other Conditions
}
Я ухожу от реализации INotifyPropertyChanged
. Используйте его для уведомления об изменениях.