Difference between revisions of "EvalExpression"
Line 22: | Line 22: | ||
==== Evaluation without parameters ==== | ==== Evaluation without parameters ==== | ||
+ | The following example shows how to evaluate a simple expression without using any parameters and then use the result for visibility binding. | ||
<tabs> | <tabs> | ||
<tab name="UWP"> | <tab name="UWP"> | ||
− | |||
<source lang = "xml"> | <source lang = "xml"> | ||
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls"> | <StackPanel xmlns:ctrls="using:UBIK.WinX.Controls"> | ||
Line 40: | Line 40: | ||
<tab name="Xamarin"> | <tab name="Xamarin"> | ||
− | |||
<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"> | ||
Line 52: | Line 51: | ||
</StackLayout> | </StackLayout> | ||
</source> | </source> | ||
− | The Label should be visible as long as at least one of the context object's two named properties has a value.</tab> | + | The Label should be visible as long as at least one of the context object's two named properties has a value. |
+ | </tab> | ||
</tabs> | </tabs> | ||
Line 88: | Line 88: | ||
</StackLayout> | </StackLayout> | ||
</source> | </source> | ||
− | 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> | + | 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> | ||
==== Setting a calculated property value ==== | ==== Setting a calculated property value ==== | ||
+ | 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: | ||
<tabs> | <tabs> | ||
<tab name="UWP"> | <tab name="UWP"> | ||
− | |||
<source lang = "xml"> | <source lang = "xml"> | ||
<Grid xmlns:ctrls="using:UBIK.WinX.Controls"> | <Grid xmlns:ctrls="using:UBIK.WinX.Controls"> | ||
Line 109: | Line 110: | ||
<tab name="Xamarin"> | <tab name="Xamarin"> | ||
− | |||
<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="Evaluator" Expression=""MP_EXAMPLE|" + (P0 + | + | <ctrls:EvalExpression x:Name="Evaluator" Expression=""MP_EXAMPLE|" + (P0 + 5)" 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 | <Button | ||
− | Text="Tap to add | + | Text="Tap to add 5 more" |
Command="{Binding SetPropertyValueAndValidateCommand}" | Command="{Binding SetPropertyValueAndValidateCommand}" | ||
CommandParameter="{Binding Path=Result, Source={x:Reference Evaluator}}"/> | CommandParameter="{Binding Path=Result, Source={x:Reference Evaluator}}"/> | ||
Line 127: | Line 127: | ||
<tabs> | <tabs> | ||
<tab name="UWP"> | <tab name="UWP"> | ||
− | If / Or statements can be evaluated using the C# syntax P0 ? P1 : P2. | + | If / Or statements can be evaluated using the C# syntax P0==true ? P1 : P2. |
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"> | ||
Line 161: | 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:10, 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 |
Contents
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
When writing expressions in XAML code, you have to avoid (escape) special characters. There are useful online tools for this. |
Evaluation without parameters
The following example shows how to evaluate a simple expression without using any parameters and then use the result for visibility binding.
UWP
<ctrls:EvalExpression
x:Name="Evaluator"
Context="{Binding}"
Expression="Context.Values["LK_OFFLINE"]!=null || Context.Values["GUIDREF"]!=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
<ctrls:EvalExpression
x:Name="Evaluator"
Context="{Binding}"
Expression="Context.Values["LK_EXAMPLE"]!=null || Context.Values["GUIDREF"]!=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.
<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.
<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
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:
UWP
<ctrls:EvalExpression x:Name="Evaluator" Expression=""MP_EXAMPLE|" + (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
<ctrls:EvalExpression x:Name="Evaluator" Expression=""MP_EXAMPLE|" + (P0 + 5)" Context="{Binding}">
<ctrls:EvalExpressionParameter Name="P0" Value="{Binding Values[MP_EXAMPLE]}" />
</ctrls:EvalExpression>
<Button
Text="Tap to add 5 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==true ? P1 : P2. In this case, if the result of the P0 expression is True, P1 will be effected. Otherwise, P2 will be.
<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.
<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>