Changes

EvalExpression

2,743 bytes added, 12:39, 4 April 2024
#2161 - Added XAML Category
}}
== 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. === 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 ===
{{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 <tabsnowiki>Bool_A || Bool_B</nowiki> is a valid expression, you should still write <nowiki>Bool_A==true || Bool_B==true</nowiki> instead.}}{{Hint|If you want to use bindings in EvalExpressionParameters, a lot of the times you need to add <tab namenowiki>Context="UWP{Binding}"</nowiki>to the EvalExpression. This is because child UI elements (parameters in this case) do not inherit the binding context of the parent by default. Manually setting the context that way ensures that the same binding expressions that work outside the EvalExpression also work inside. Although this is not necessary if the binding you use explicitly refers to a named UI element.}}
==== 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><tab name="UWP">
<source lang = "xml">
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls">
<ctrls:EvalExpression x:Name="ExpressionEvaluatorEvaluator" Context="{Binding Self}" Expression="Context.Values[&quot;LK_OFFLINE&quot;]!=null || Context.Values[&quot;GUIDREF&quot;]!=null" /> <TextBlock Foreground="White" Text="Some Text" Visibility="{Binding ElementName=ExpressionEvaluatorEvaluator, Path=Result, Converter={StaticResource BoolToVisConverter}}" />
</StackPanel>
</source>
 
The TextBlock should be visible as long as at least one of the context object's two named properties has a value.
</tab>
<tab name="Xamarin"><source lang ="xml"><StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly= Simple Calculation 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 BoolToBool}}" /></StackLayout></source>The following example shows how to use Label should be visible as long as at least one of the control with three parameters, where the first two are user input (Textbox context object''Param0'' and ''Param1'') and the third one is s two named properties has a property from its DataContext (ViewModel). The evaluated ''Result'' is then bound to a Textblock for output in the UIvalue.</tab></tabs>
==== Simple calculation ====
<tabs>
<tab name="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.
<source lang = "xml">
<StackPanel xmlns:ctrls="using:UBIK.WinX.Controls" HorizontalAlignment="Center" Orientation="Vertical"> <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:EvalExpressionParameter Name="P2" Value="{Binding IsLoggedIn}" /> </ctrls:EvalExpression> <TextBlock Foreground="White" Text="{Binding ElementName=Evaluator, Path=Result}" />
</StackPanel>
</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.
</tab>
Lets assume that <tab name="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.<source lang = "xml"><StackLayout xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL"> <Editor x:Name="Expression"/> <Editor x:Name="Param0" WidthRequest="32"/> <Editor x:Name="Param1" 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 Param0}}" /> <ctrls:EvalExpressionParameter Name="P1" Value="{Binding Path=WidthRequest, Source={x:Reference Param1}}" /> </ctrls:EvalExpression> <Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" /></StackLayout></source>Since Textbox ''Param0P0'' contains has a text width of 42 32 and ''Param1P1'' contains has a text width of 43. If ''Expression'' now contains <code>(P0 + P1) *2</code> then the result would display 17075.</tab>==== Setting a calculated Property Value ====</tabs>
==== 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><tab name="UWP">
<source lang = "xml">
<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], Converter={StaticResource ToType}, ConverterParameter='System.Int32'}" />
</ctrls:EvalExpression>
<Button Content="Tap for 5 more" Command="{Binding SetPropertyValueAndValidateCommand}" CommandParameter="{Binding ElementName=Evaluator, Path=Result}"/>
</Grid>
</source>
</tab>
<tab name== Conditional Statement == 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."Xamarin">
<source lang = "xml">
<Grid xmlns:ctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL"> <ctrls:EvalExpression x:Name="InitialiseParameterWhenNullEvaluator" Expression="&quot;MP_EXAMPLE|&quot; + (P0==null+ 5) ? P1 : P2" Context="{Binding}"> <Controlsctrls:EvalExpressionParameter Name="P0" Value="{Binding StoredProfileParametersValues[WPType1MP_EXAMPLE]}" /> <Controls:EvalExpressionParameter Name="P1" Value="WPType1=1" /ctrls:EvalExpression> <Controls:EvalExpressionParameter NameButton Text="P2Tap to add 5 more" Value Command="{Binding ElementNameSetPropertyValueAndValidateCommand}" CommandParameter=InitialiseParameter, "{Binding Path=Result, Source={x:Reference Evaluator}}" /> </Controls:EvalExpressionGrid>
</source>
</tab>
</tabs>
==== Conditional statement ====
== Parameters ==EvalExpressionParameters If / Or statements can also be added as child objects to an EvalExpression controlevaluated using C# syntax. Each In this case, if the result of the "Condi" parameter is true, namely if the context object needs a unique ''Name'' and a ''Value''s MP_STATUS property value equals to 0, where the latter can P0's value will be either a constant or dynamic displayed in the Label, otherwise P1's value supplied through a bindingwill be displayed.
<tabs>
<tab name="UWP">
<source lang = "xml">
<Grid xmlns:ctrls="using:UBIK.WinX.Controls">
<ctrls:EvalExpression x:Name="Evaluator" Expression="Condi == true ? P0 : P1" Context="{Binding}">
<ctrls:EvalExpressionParameter Name="Condi" Value="{Binding Values[MP_STATUS], Converter={StaticResource EqualToTrueConverter}, ConverterParameter=0}" />
<ctrls:EvalExpressionParameter Name="P0" Value="State1" />
<ctrls:EvalExpressionParameter Name="P1" Value="State2" />
</ctrls:EvalExpression>
<TextBlock Text="{Binding ElementName=Evaluator, Path=Result}" />
</Grid>
</source>
</tab>
<tab name="Xamarin">
EvalExpressions are also available for usage with Xamarin customisations.
 
{{Attention|Note that extra syntax is required to get the EvalExpression to work in Xamarin!}}
 
<source lang = "xml">
<Grid xmlns:controlsctrls="clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL">... <controlsctrls:EvalExpression x:Name="UppercaseTitleEvaluator" Expression="(Condi == true ? P0 : P1.ToUpper())" Context="{Binding}"> <controlsctrls:EvalExpressionParameter Name="P1Condi" Value="{Binding PropertyItem.MetaProperty.DescriptionValues[MP_STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=0}" /> <ctrls:EvalExpressionParameter Name="P0" Value="State1" /controls> <ctrls:EvalExpressionParameter Name="P1" Value="State2" /> </ctrls:EvalExpression> <Label Text="{Binding Path=Result, Source={x:Reference Evaluator}}" /></Grid>
</source>
</tab>
</tabs>
 
The above example converts a text (in this situation, the Description text of a property) to a capitalised version. Note that the text <b>Context="{Binding}"</b> is required for the expression to function in Xamarin.
To output the result of your expression, use the following syntax:
<source lang = "xml">
<Label Text="{Binding Path=Result, Source={x:Reference UppercaseTitle}}" />
</source>
Note that the correct way to reference elements in Xamarin is x:Reference (ie. the UWP equivalent of ElementName=), followed by the name given to your EvalExpression.
</tab>
</tabs>
==See also==
[[Category:WinX|EvalExpression]]
[[Category:Xamarin|EvalExpression]]
[[Category:XAML|EvalExpression]]
643
edits

Help improve this page!