Jump to: navigation, search

Difference between revisions of "EvalExpression"


(Simple Calculation)
Line 10: Line 10:
  
  
== Concept==
+
== Concept ==
The EvalExpression control allows to evaluate a C# expression from within XAML markup. The ''Expression'' has to be a single-line, valid C# expression ("Lambda") and has to return a single value; expressions can also reference names of subordinate [[EvalExpression#Parameters|EvalExpressionParameter]] items.
+
The EvalExpression control allows to evaluate a C# expression from within XAML markup. The ''Expression'' has to be a single-line, valid C# expression ("Lambda") and has to return a single value; expressions can also reference names of subordinate [[EvalExpression#Parameters|EvalExpressionParameter]] items.
  
 +
=== Parameters ===
 +
EvalExpressionParameters can be added as child objects to an EvalExpression control. Each parameter object needs a unique ''Name'' and a ''Value'', where the latter can be either a constant or dynamic value supplied through a binding.
  
 
=== Examples ===
 
=== Examples ===
 +
 
{{Hint|When writing expressions in XAML code, you have to avoid (escape) special characters. There are useful [https://www.freeformatter.com/xml-escape.html online tools] for this.}}
 
{{Hint|When writing expressions in XAML code, you have to avoid (escape) special characters. There are useful [https://www.freeformatter.com/xml-escape.html online tools] for this.}}
 +
{{Hint|When writing expressions, it's always better (even necessary in some cases) to write them in their full forms. For example, while <nowiki>Bool_A || Bool_B</nowiki> is a valid expression, you should still write <nowiki>Bool_A==true || Bool_B==true</nowiki> instead.}}
  
 
==== Evaluation without parameters ====
 
==== Evaluation without parameters ====
Line 23: Line 27:
 
<source lang = "xml">
 
<source lang = "xml">
 
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls">
 
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls">
<ctrls:EvalExpression
+
    <ctrls:EvalExpression
                x:Name="ExpressionEvaluator"
+
        x:Name="Evaluator"
                Context="{Binding Self}"
+
        Context="{Binding}"
                Expression="Context.Values[&quot;LK_OFFLINE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" />
+
        Expression="Context.Values[&quot;LK_OFFLINE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" />
<TextBlock Foreground="White" Visibility="{Binding ElementName=ExpressionEvaluator, Path=Result, Converter={StaticResource BoolToVisConverter}}" />
+
    <TextBlock
 +
        Foreground="White"
 +
        Visibility="{Binding ElementName=Evaluator, Path=Result, Converter={StaticResource BoolToVisConverter}}" />
 
</StackPanel>
 
</StackPanel>
 
</source>
 
</source>
Line 37: Line 43:
 
<source lang = "xml">
 
<source lang = "xml">
 
<StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
 
<StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
<ctrls:EvalExpression
+
    <ctrls:EvalExpression
x:Name="ControllingVisibility"
+
        x:Name="Evaluator"
Context="{Binding}"
+
        Context="{Binding}"
Expression="Context.Values[&quot;LK_EXAMPLE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" />
+
        Expression="Context.Values[&quot;LK_EXAMPLE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" />
<Label  
+
    <Label
              TextColor="#00000"
+
        TextColor="#00000"
              IsVisible="{Binding Path=Result, Source={x:Reference ControllingVisibility}, Converter={StaticResource NullToBoolConverter}}" />
+
        IsVisible="{Binding Path=Result, Source={x:Reference Evaluator}, Converter={StaticResource NullToBoolConverter}}" />
 
</StackLayout>
 
</StackLayout>
 
</source>
 
</source>
Line 49: Line 55:
 
</tabs>
 
</tabs>
  
==== Simple Calculation ====
+
==== Simple calculation ====
 
<tabs>
 
<tabs>
 
<tab name="UWP">
 
<tab name="UWP">
The following example shows how to use the control with three parameters, where the first two are user input (Textbox ''Param0'' and ''Param1'') and the third one is a property from its DataContext (ViewModel). The evaluated ''Result'' is then bound to a Textblock for output in the UI.
+
The following example shows how to use an expression with two parameters (''Param0'' and ''Param1''). The evaluated ''Result'' is then bound to a TextBlock for output in the UI.
 
<source lang = "xml">
 
<source lang = "xml">
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls"
+
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls">
HorizontalAlignment="Center"
+
    <TextBox x:Name="Expression" Width="200" />
Orientation="Vertical">
+
    <TextBox x:Name="Param0" Width="200" />
<TextBox x:Name="Expression" Width="200" />
+
    <TextBox x:Name="Param1" Width="200" />
<TextBox x:Name="Param0" Width="200" />
+
    <ctrls:EvalExpression x:Name="Evaluator" Expression="{Binding ElementName=Expression, Path=Text}" Context="{Binding}">
<TextBox x:Name="Param1" Width="200" />
+
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding ElementName=Param0, Path=Text, Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
<ctrls:EvalExpression x:Name="Evaluator" Expression="{Binding ElementName=Expression, Path=Text}" Context="{Binding}">
+
        <ctrls:EvalExpressionParameter Name="P1" Value="{Binding ElementName=Param1, Path=Text, Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
<ctrls:EvalExpressionParameter Name="P0" Value="{Binding ElementName=Param0, Path=Text, Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
+
    </ctrls:EvalExpression>
<ctrls:EvalExpressionParameter Name="P1" Value="{Binding ElementName=Param1, Path=Text, Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
+
    <TextBlock Foreground="White" Text="{Binding ElementName=Evaluator, Path=Result}" />
<ctrls:EvalExpressionParameter Name="P2" Value="{Binding IsLoggedIn}" />
+
</ctrls:EvalExpression>
+
<TextBlock Foreground="White" Text="{Binding ElementName=Evaluator, Path=Result}" />
+
 
</StackPanel>
 
</StackPanel>
 
</source>
 
</source>
Lets assume that the Textbox ''Param0'' contains a text of 42 and ''Param1'' contains a text of 43. If ''Expression'' now contains <code>(P0 + P1) *2</code> then the result would display 170.
+
Lets assume that the Textbox ''Param0'' contains a text of 42 and ''Param1'' contains a text of 43. If ''Expression'' now contains <code>(P0 + P1) *2</code> then the result would display 170.
 
</tab>
 
</tab>
  
 
<tab name="Xamarin">
 
<tab name="Xamarin">
The following example shows how to use the control with three parameters, where the first two are user input (Editor ''Param0'' and ''Param1'') and the third one is a property from its DataContext (ViewModel). The evaluated ''Result'' is then bound to an Label for output in the UI.
+
The following example shows how to use an expression with two parameters (''Param0'' and ''Param1''). The evaluated ''Result'' is then bound to a Label for output in the UI.
 
<source lang = "xml">
 
<source lang = "xml">
 
<StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
 
<StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
<Editor x:Name="Expression"/>
+
    <Editor x:Name="Expression"/>
<Editor x:Name="P0" WidthRequest="32"/>
+
    <Editor x:Name="P0" WidthRequest="32"/>
<Editor x:Name="P1" WidthRequest="43"/>
+
    <Editor x:Name="P1" WidthRequest="43"/>
<ctrls:EvalExpression x:Name="Evaluator" Expression="{Binding Path=Text, Source={x:Reference Expression}}" Context="{Binding}">
+
    <ctrls:EvalExpression x:Name="Evaluator" Expression="{Binding Path=Text, Source={x:Reference Expression}}" Context="{Binding}">
<ctrls:EvalExpressionParameter Name="P0" Value="{Binding Path=WidthRequest, Source={x:Reference P0}}" />
+
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Path=WidthRequest, Source={x:Reference P0}}" />
<ctrls:EvalExpressionParameter Name="P1" Value="{Binding Path=WidthRequest, Source={x:Reference P1}}" />
+
        <ctrls:EvalExpressionParameter Name="P1" Value="{Binding Path=WidthRequest, Source={x:Reference P1}}" />
</ctrls:EvalExpression>
+
    </ctrls:EvalExpression>
<Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" />
+
    <Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" />
 
</StackLayout>
 
</StackLayout>
 
</source>
 
</source>
Lets assume that the Textbox ''P0'' has a width of 32 and ''P1'' has a width of 43. If ''Expression'' now contains  <code>(P0 + P1)</code> then the result would display 75.</tab>
+
Since Textbox ''P0'' has a width of 32 and ''P1'' has a width of 43. If ''Expression'' now contains  <code>(P0 + P1)</code> then the result would display 75.</tab>
 
</tabs>
 
</tabs>
  
[[Category:Client|EvalExpression]]
+
==== Setting a calculated property value ====
[[Category:Pages with broken file links|EvalExpression]]
+
[[Category:WinX|EvalExpression]]
+
[[Category:Xamarin|EvalExpression]]
+
 
+
==== Setting a calculated Property Value ====
+
 
<tabs>
 
<tabs>
 
<tab name="UWP">
 
<tab name="UWP">
Line 99: Line 97:
 
<source lang = "xml">
 
<source lang = "xml">
 
<Grid xmlns:ctrls="using:UBIK.WinX.Controls">
 
<Grid xmlns:ctrls="using:UBIK.WinX.Controls">
     <ctrls:EvalExpression x:Name="Evaluator" Expression="&quot;MP_EXAMPLE|&quot; + (P0 + 5)">
+
     <ctrls:EvalExpression x:Name="Evaluator" Expression="&quot;MP_EXAMPLE|&quot; + (P0 + 5)" Context="{Binding}">
         <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE], Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
+
         <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE]}" />
 
     </ctrls:EvalExpression>
 
     </ctrls:EvalExpression>
     <Button Content="Tap for 5 more" Command="{Binding SetPropertyValueAndValidateCommand}" CommandParameter="{Binding ElementName=Evaluator, Path=Result}"/>
+
     <Button
 +
        Content="Tap for 5 more"
 +
        Command="{Binding SetPropertyValueAndValidateCommand}"
 +
        CommandParameter="{Binding ElementName=Evaluator, Path=Result}"/>
 
</Grid>
 
</Grid>
 
</source>
 
</source>
Line 111: Line 112:
 
<source lang = "xml">
 
<source lang = "xml">
 
<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
 
<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
<ctrls:EvalExpression x:Name="Evaluator2" Expression="&quot;MP_EXAMPLE|&quot; + (P0 + 2)" Context="{Binding}">
+
    <ctrls:EvalExpression x:Name="Evaluator" Expression="&quot;MP_EXAMPLE|&quot; + (P0 + 2)" Context="{Binding}">
    <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE]}" />
+
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE]}" />
</ctrls:EvalExpression>
+
    </ctrls:EvalExpression>
<Button Text="Tap to add 2 more"
+
    <Button
      Command="{Binding SetPropertyValueAndValidateCommand}" CommandParameter="{Binding Path=Result, Source={x:Reference Evaluator2}}"/>
+
        Text="Tap to add 2 more"
 +
        Command="{Binding SetPropertyValueAndValidateCommand}"
 +
        CommandParameter="{Binding Path=Result, Source={x:Reference Evaluator}}"/>
 
</Grid>
 
</Grid>
 
</source>
 
</source>
Line 121: Line 124:
 
</tabs>
 
</tabs>
  
 
+
==== Conditional statement ====
 
+
 
+
 
+
 
+
== Conditional Statement ==
+
 
<tabs>
 
<tabs>
 
<tab name="UWP">
 
<tab name="UWP">
Line 132: Line 130:
 
In this case, if the result of the P0 expression is True, P1 will be effected. Otherwise, P2 will be.
 
In this case, if the result of the P0 expression is True, P1 will be effected. Otherwise, P2 will be.
 
<source lang = "xml">
 
<source lang = "xml">
        <Controls:EvalExpression x:Name="InitialiseParameterWhenNull" Expression="(P0==null) ? P1 : P2">
+
<Grid xmlns:ctrls="using:UBIK.WinX.Controls">
            <Controls:EvalExpressionParameter Name="P0" Value="{Binding StoredProfileParameters[WPType1]}" />
+
    <ctrls:EvalExpression x:Name="InitialiseParameterWhenNull" Expression="(P0==null) ? P1 : P2" Context="{Binding}">
<Controls:EvalExpressionParameter Name="P1" Value="WPType1=1" />
+
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding StoredProfileParameters[WPType1]}" />
<Controls:EvalExpressionParameter Name="P2" Value="{Binding ElementName=InitialiseParameter, Path=Result}" />
+
        <ctrls:EvalExpressionParameter Name="P1" Value="WPType1=1" />
        </Controls:EvalExpression>
+
        <ctrls:EvalExpressionParameter Name="P2" Value="{Binding ElementName=InitialiseParameter, Path=Result}" />
 +
    </ctrls:EvalExpression>
 +
</Grid>
 
</source>
 
</source>
 
</tab>
 
</tab>
Line 145: Line 145:
 
<source lang = "xml">
 
<source lang = "xml">
 
<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
 
<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
<controls:EvalExpression x:Name="StatusAutomator" Expression="P0 == true ? P00 : (P1 == true ? P10)" Context="{Binding}">
+
    <controls:EvalExpression x:Name="Evaluator" Expression="P0 == true ? P00 : (P1 == true ? P10)" Context="{Binding}">
<controls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=0}" />
+
        <controls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=0}" />
<controls:EvalExpressionParameter Name="P00" Value="State1" />
+
        <controls:EvalExpressionParameter Name="P00" Value="State1" />
<controls:EvalExpressionParameter Name="P1" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=10}" />
+
        <controls:EvalExpressionParameter Name="P1" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=10}" />
<controls:EvalExpressionParameter Name="P10" Value="State2" />
+
        <controls:EvalExpressionParameter Name="P10" Value="State2" />
</controls:EvalExpression>
+
    </controls:EvalExpression>
<Label
+
    <Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" />
Text="{Binding Path=Result, Source={x:Reference StatusAutomator}}"
+
</Grid>
FontSize="16"/>
+
</Grid>
+
 
</source>
 
</source>
 
</tab>
 
</tab>
 
</tabs>
 
</tabs>
 
 
 
 
 
 
== Parameters ==
 
EvalExpressionParameters can be added as child objects to an EvalExpression control. Each parameter object needs a unique ''Name'' and a ''Value'', where the latter can be either a constant or dynamic value supplied through a binding.
 
  
 
==See also==
 
==See also==
Line 171: Line 161:
  
 
[[Category:Client|EvalExpression]]
 
[[Category:Client|EvalExpression]]
[[Category:Pages with broken file links|EvalExpression]]
 
 
[[Category:WinX|EvalExpression]]
 
[[Category:WinX|EvalExpression]]
 
[[Category:Xamarin|EvalExpression]]
 
[[Category:Xamarin|EvalExpression]]

Revision as of 11:04, 26 January 2021

EvalExpression
220px
imagecaption
Name EvalExpression
Namespace "using:UBIK.WinX.Controls" in UBIK.UWP
"clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL" in UBIK.Xamarin
Purpose Evaluate a C# expression in XAML
Version 3.2+ in UBIK.UWP 1.0+ in UBIK.Xamarin


Concept

The EvalExpression control allows to evaluate a C# expression from within XAML markup. The Expression has to be a single-line, valid C# expression ("Lambda") and has to return a single value; expressions can also reference names of subordinate EvalExpressionParameter items.

Parameters

EvalExpressionParameters can be added as child objects to an EvalExpression control. Each parameter object needs a unique Name and a Value, where the latter can be either a constant or dynamic value supplied through a binding.

Examples

IC Hint square.pngWhen writing expressions in XAML code, you have to avoid (escape) special characters. There are useful online tools for this.
IC Hint square.pngWhen writing expressions, it's always better (even necessary in some cases) to write them in their full forms. For example, while Bool_A || Bool_B is a valid expression, you should still write Bool_A==true || Bool_B==true instead.

Evaluation without parameters

UWP

The following example shows how to evaluate a simple expression without using any parameters and then use the result for visibility binding.

<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls">
    <ctrls:EvalExpression
       x:Name="Evaluator"
       Context="{Binding}"
       Expression="Context.Values[&quot;LK_OFFLINE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" />
    <TextBlock
       Foreground="White"
       Visibility="{Binding ElementName=Evaluator, Path=Result, Converter={StaticResource BoolToVisConverter}}" />
</StackPanel>

The TextBlock should be visible as long as at least one of the context object's two named properties has a value.

Xamarin

The following example shows how to evaluate a simple expression without using any parameters and then use the result for visibility binding.

<StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
    <ctrls:EvalExpression
       x:Name="Evaluator"
       Context="{Binding}"
       Expression="Context.Values[&quot;LK_EXAMPLE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" />
    <Label
       TextColor="#00000"
       IsVisible="{Binding Path=Result, Source={x:Reference Evaluator}, Converter={StaticResource NullToBoolConverter}}" />
</StackLayout>
The Label should be visible as long as at least one of the context object's two named properties has a value.

Simple calculation

UWP

The following example shows how to use an expression with two parameters (Param0 and Param1). The evaluated Result is then bound to a TextBlock for output in the UI.

<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls">
    <TextBox x:Name="Expression" Width="200" />
    <TextBox x:Name="Param0" Width="200" />
    <TextBox x:Name="Param1" Width="200" />
    <ctrls:EvalExpression x:Name="Evaluator" Expression="{Binding ElementName=Expression, Path=Text}" Context="{Binding}">
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding ElementName=Param0, Path=Text, Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
        <ctrls:EvalExpressionParameter Name="P1" Value="{Binding ElementName=Param1, Path=Text, Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
    </ctrls:EvalExpression>
    <TextBlock Foreground="White" Text="{Binding ElementName=Evaluator, Path=Result}" />
</StackPanel>

Lets assume that the Textbox Param0 contains a text of 42 and Param1 contains a text of 43. If Expression now contains (P0 + P1) *2 then the result would display 170.

Xamarin

The following example shows how to use an expression with two parameters (Param0 and Param1). The evaluated Result is then bound to a Label for output in the UI.

<StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
    <Editor x:Name="Expression"/>
    <Editor x:Name="P0" WidthRequest="32"/>
    <Editor x:Name="P1" WidthRequest="43"/>
    <ctrls:EvalExpression x:Name="Evaluator" Expression="{Binding Path=Text, Source={x:Reference Expression}}" Context="{Binding}">
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Path=WidthRequest, Source={x:Reference P0}}" />
        <ctrls:EvalExpressionParameter Name="P1" Value="{Binding Path=WidthRequest, Source={x:Reference P1}}" />
    </ctrls:EvalExpression>
    <Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" />
</StackLayout>
Since Textbox P0 has a width of 32 and P1 has a width of 43. If Expression now contains (P0 + P1) then the result would display 75.

Setting a calculated property value

UWP

The following example shows how to create a button that adds and stores +5 to the value of a a numeric property named MP_EXAMPLE, every time it is pressed:

<Grid xmlns:ctrls="using:UBIK.WinX.Controls">
    <ctrls:EvalExpression x:Name="Evaluator" Expression="&quot;MP_EXAMPLE|&quot; + (P0 + 5)" Context="{Binding}">
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE]}" />
    </ctrls:EvalExpression>
    <Button
       Content="Tap for 5 more"
       Command="{Binding SetPropertyValueAndValidateCommand}"
       CommandParameter="{Binding ElementName=Evaluator, Path=Result}"/>
</Grid>

Xamarin

The following example shows how to create a button that adds and stores +5 to the value of a a numeric property named MP_EXAMPLE, every time it is pressed:

<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
    <ctrls:EvalExpression x:Name="Evaluator" Expression="&quot;MP_EXAMPLE|&quot; + (P0 + 2)" Context="{Binding}">
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE]}" />
    </ctrls:EvalExpression>
    <Button
       Text="Tap to add 2 more"
       Command="{Binding SetPropertyValueAndValidateCommand}"
       CommandParameter="{Binding Path=Result, Source={x:Reference Evaluator}}"/>
</Grid>

Conditional statement

UWP

If / Or statements can be evaluated using the C# syntax P0 ? P1 : P2. In this case, if the result of the P0 expression is True, P1 will be effected. Otherwise, P2 will be.

<Grid xmlns:ctrls="using:UBIK.WinX.Controls">
    <ctrls:EvalExpression x:Name="InitialiseParameterWhenNull" Expression="(P0==null) ? P1 : P2" Context="{Binding}">
        <ctrls:EvalExpressionParameter Name="P0" Value="{Binding StoredProfileParameters[WPType1]}" />
        <ctrls:EvalExpressionParameter Name="P1" Value="WPType1=1" />
        <ctrls:EvalExpressionParameter Name="P2" Value="{Binding ElementName=InitialiseParameter, Path=Result}" />
    </ctrls:EvalExpression>
</Grid>

Xamarin

If / Or statements can also be evaluated using various C# syntax. In this case, if the result of the P0 expression is true P00 will be used, if P1 is true P10 will be used.

<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">
    <controls:EvalExpression x:Name="Evaluator" Expression="P0 == true ? P00 : (P1 == true ? P10)" Context="{Binding}">
        <controls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=0}" />
        <controls:EvalExpressionParameter Name="P00" Value="State1" />
        <controls:EvalExpressionParameter Name="P1" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=10}" />
        <controls:EvalExpressionParameter Name="P10" Value="State2" />
    </controls:EvalExpression>         
    <Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" />
</Grid>

See also