Использование 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>

Установите значение Enum с помощью определенной логики в вашем коде...

Пример:

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

Я ухожу от реализации INotifyPropertyChanged, Используйте его для предоставления уведомлений об изменениях.

Другие вопросы по тегам