6

I am using XAML code part of which is

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

Now I want to use a dataTrigger which can have values as 3, 301, 302 or 303. How can I do this. I tried with Multidatatrigger, but it doesn't worked. The code I tried with Multidatatrigger was:

<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>
Anatoliy Nikolaev
  • 22,370
  • 15
  • 69
  • 68
Jainendra
  • 24,713
  • 30
  • 122
  • 169

2 Answers2

10

MultiDataTrigger applies when all of the conditions are met not any, that's why your MultiDataTrigger isn't working.

Either have four separate triggers, or put the condition into a separate boolean property such as

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

raise a property change notification for ShowAssessment when Value changes

e.g

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

and then trigger on ShowAssessment.

Probably a better solution is to add a HeaderText property with a switch statement that returns the correct header text based on Value. Then just bind the header's text to that. No triggers required.

Phil
  • 42,255
  • 9
  • 100
  • 100
  • I want the trigger to apply when any one of the value satisfies. I want in one trigger only without using four triggers. – Jainendra Apr 18 '12 at 10:29
  • There are a couple of solutions in my answer. One trigger for your four values, or no triggers by moving the logic into the view model. – Phil Apr 18 '12 at 10:32
0

MultidataTrigger will act when all condition are satisfied . So

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

You will require a single DataTrigger

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

Set the Value of the Enum with a Defined logic in your code...

Example :

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

I am leaving the implementation of INotifyPropertyChanged. Use it to provide change notifications.

Community
  • 1
  • 1
Ankesh
  • 4,847
  • 4
  • 38
  • 76