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# | + | 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 | |
− | + | 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> | </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 | |
− | + | 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> | </StackLayout> | ||
</source> | </source> | ||
Line 49: | Line 55: | ||
</tabs> | </tabs> | ||
− | ==== Simple | + | ==== Simple calculation ==== |
<tabs> | <tabs> | ||
<tab name="UWP"> | <tab name="UWP"> | ||
− | The following example shows how to use | + | 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"> |
− | + | <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> | </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 | + | 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 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="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> | </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> | |
</tabs> | </tabs> | ||
− | + | ==== Setting a calculated property value ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | ==== Setting a calculated | + | |
<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=""MP_EXAMPLE|" + (P0 + 5)"> | + | <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 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="Evaluator" Expression=""MP_EXAMPLE|" + (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> | </Grid> | ||
</source> | </source> | ||
Line 121: | Line 124: | ||
</tabs> | </tabs> | ||
− | + | ==== Conditional statement ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | == Conditional | + | |
<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"> | ||
− | + | <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> | ||
</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="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> | |
− | + | ||
− | + | ||
</source> | </source> | ||
</tab> | </tab> | ||
</tabs> | </tabs> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==See also== | ==See also== | ||
Line 171: | Line 161: | ||
[[Category:Client|EvalExpression]] | [[Category:Client|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 |
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
UWP
The following example shows how to evaluate a simple expression without using any parameters and then use the result for visibility binding.
<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
The following example shows how to evaluate a simple expression without using any parameters and then use the result for visibility binding.
<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>
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>
(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:
<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
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:
<ctrls:EvalExpression x:Name="Evaluator" Expression=""MP_EXAMPLE|" + (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.
<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>