<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.augmensys.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=CWI</id>
		<title>UBIK Wiki / Augmensys - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.augmensys.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=CWI"/>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Special:Contributions/CWI"/>
		<updated>2026-09-29T21:35:13Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Sync_Mode&amp;diff=30608</id>
		<title>Sync Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Sync_Mode&amp;diff=30608"/>
				<updated>2026-09-24T10:11:45Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Behavior on connection loss */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sync mode is a user configurable setting which affects the way {{UBIK}} client communicates with {{UBIK}} server. More specifically, it determines when and how the client fetches/commits {{UBIK}} content, or whether to have data communication at all.&lt;br /&gt;
&lt;br /&gt;
== Possible sync modes ==&lt;br /&gt;
There are three/four different modes in {{UBIK}}. Here are their names and defined behaviors:&lt;br /&gt;
* Auto / Online: content is fetched/committed automatically;&lt;br /&gt;
* Manual Commit: content is fetched automatically; commit only happens when triggered by users;&lt;br /&gt;
* Offline: content is only fetched/committed when triggered by users;&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;64&amp;quot; heights=&amp;quot;64&amp;quot;&amp;gt;&lt;br /&gt;
File:UI_Android_AutomaticMode.jpg|Auto / Online&lt;br /&gt;
File:UI_Android_ManualCommitMode.jpg|Manual Commit&lt;br /&gt;
File:UI_Android_OfflineMode.jpg|Offline&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mode switch &amp;amp; indicator ==&lt;br /&gt;
[[File:UI_Android_ModeSwitchAndIndicator.png|thumb|alt=Mode Switch and Indicator|Mode Switch and Indicator]]&lt;br /&gt;
In the [[UBIK Client Basics#Navigation Drawer|navigation drawer]] of any standard {{UBIK}} client applications, there are three buttons for switching between the different modes. Clicking one of them allows users to switch {{UBIK}} to the corresponding sync mode.&lt;br /&gt;
&lt;br /&gt;
In case users choose to download some content before switching to offline mode, the offline button will display the prepare mode icon until the download is finished.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
== Behavior on connection loss ==&lt;br /&gt;
If network connectivity is lost while the Client is running in Auto/Online mode, the client switches to Offline as soon as the next data operation (fetch/commit) is attempted. It then checks for connectivity every 5 seconds. Once the connection has been stable for 15 seconds, it automatically switches back to Auto/Online mode (usually 15-20 seconds after connectivity returns).&lt;br /&gt;
&lt;br /&gt;
{{Hint|This automatic recovery only happens if the Client was already in Auto/Online (or Manual) mode when the connection dropped. If the Client is started or logged in while no network connection is available, it starts directly in Offline mode and stays there, even once connectivity returns. It then needs to be switched to Auto/Online or Manual mode manually.}}&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Sync Mode]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[HowTo:Switch to Offline Mode]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Sync Mode]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Sync_Mode&amp;diff=30607</id>
		<title>Sync Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Sync_Mode&amp;diff=30607"/>
				<updated>2026-09-24T10:09:21Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sync mode is a user configurable setting which affects the way {{UBIK}} client communicates with {{UBIK}} server. More specifically, it determines when and how the client fetches/commits {{UBIK}} content, or whether to have data communication at all.&lt;br /&gt;
&lt;br /&gt;
== Possible sync modes ==&lt;br /&gt;
There are three/four different modes in {{UBIK}}. Here are their names and defined behaviors:&lt;br /&gt;
* Auto / Online: content is fetched/committed automatically;&lt;br /&gt;
* Manual Commit: content is fetched automatically; commit only happens when triggered by users;&lt;br /&gt;
* Offline: content is only fetched/committed when triggered by users;&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;64&amp;quot; heights=&amp;quot;64&amp;quot;&amp;gt;&lt;br /&gt;
File:UI_Android_AutomaticMode.jpg|Auto / Online&lt;br /&gt;
File:UI_Android_ManualCommitMode.jpg|Manual Commit&lt;br /&gt;
File:UI_Android_OfflineMode.jpg|Offline&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mode switch &amp;amp; indicator ==&lt;br /&gt;
[[File:UI_Android_ModeSwitchAndIndicator.png|thumb|alt=Mode Switch and Indicator|Mode Switch and Indicator]]&lt;br /&gt;
In the [[UBIK Client Basics#Navigation Drawer|navigation drawer]] of any standard {{UBIK}} client applications, there are three buttons for switching between the different modes. Clicking one of them allows users to switch {{UBIK}} to the corresponding sync mode.&lt;br /&gt;
&lt;br /&gt;
In case users choose to download some content before switching to offline mode, the offline button will display the prepare mode icon until the download is finished.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
== Behavior on connection loss ==&lt;br /&gt;
If network connectivity is lost while the Client is running in Auto/Online mode, the client switches to Offline as soon as the next data operation (fetch/commit) is attempted. It then checks for connectivity every 5 seconds. Once the connection has been stable for 15 seconds, it automatically switches back to '''Auto/Online''' mode (usually 15-20 seconds after connectivity returns).&lt;br /&gt;
&lt;br /&gt;
{{Hint|This automatic recovery only happens if the Client was already in Auto/Online (or Manual) mode when the connection dropped. If the Client is started or logged in while no network connection is available, it starts directly in Offline mode and stays there, even once connectivity returns. It then needs to be switched to Auto/Online or Manual mode manually.}}&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[HowTo:Switch to Offline Mode]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Sync Mode]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30605</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30605"/>
				<updated>2026-09-24T07:36:08Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
* [[XAML_Tips#Default_Tab_Selection|Default tab preselection via the TabSelector]] is now enabled for the standard Mobile Client.&lt;br /&gt;
* Fixed an issue where clicking out of a Property direct editing input field didn't confirm the value.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* On some Android devices (Pixel 7A, iSafe 930.1 as we know), the app doesn't recognize the device cameras on the first launch after fresh installations. If this happens, please simply restart the app and it should be fine from then on.&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.2_(Mobile)&amp;diff=30590</id>
		<title>Version 5.2 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.2_(Mobile)&amp;diff=30590"/>
				<updated>2026-09-15T12:24:05Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.2.? on 2026-??-?? ===&lt;br /&gt;
* The [[MROCLS_TEXT_TASK|TextTaskClassification]] and [[MROCLS_SIGNATURE_TASK|SignatureTaskClassification]] have now a proper UID.&lt;br /&gt;
* Added [[MROCLS_INTEGER_TASK|IntegerTaskClassification]] and [[MROCLS_INTERFACE_TASK|InterfaceTaskClassification]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.5 on 2026-09-01 {{key press|Android: Store}} 5.2.10 on 2026-09-09 {{key press|iOS: Store}} ===&lt;br /&gt;
* {{UBIK}} now supports credentials containing accented (and other special) characters, enabling users to authenticate successfully with a wider range of credential formats. (This must be paired with the [[Version_5.2.0_(Server)|5.2 service version]].)&lt;br /&gt;
* Fixed an issue where clients displayed extremely large or small values using scientific notation.&lt;br /&gt;
* Fixed an issue where POIs for scanned 2D codes are not stable and jump a lot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.3 on 2026-08-04 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where documents did not reload properly.&lt;br /&gt;
* Fixed an issue where it was not possible to toggle the text input scanner from within the string edit dialog, and added [[Editors#String_value_editor|a button]] to do so to the default UI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.2 on 2026-07-21 {{key press|Android: Store Beta}}{{key press|iOS: Store Beta}} ===&lt;br /&gt;
* Added support for [[Login_View#Offline_SSO_Login|Offline SSO Login]], allowing users to securely access the UBIK Client in offline mode after a successful online SSO authentication.&lt;br /&gt;
* UBIK LABs (Experimental) The update interval for live value updates (LiveValueUpdateIntervalMs) can be configured in profiles.&lt;br /&gt;
* Updated all client localization translations.&lt;br /&gt;
* Updated misleading text resources on dialogues to delete an object on the server and to locally discard an object.&lt;br /&gt;
* Fixed an issue where DocumentViewModel.ShowDocumentCommand did not work when combined with InvokeCommandAction.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.2|Version 5.2 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* On some Android devices (Pixel 7A, iSafe 930.1 as we know), the app doesn't recognize the device cameras on the first launch after fresh installations. If this happens, please simply restart the app and it should be fine from then on.&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
* [[Editors#String_value_editor|UBIKEditString]] now uses ScanningIsActive rather than CallingViewModel.ScanToInput to show/hide the text input scanner/QR reader. Backwards compatibility is retained for existing customizings, inlcuding that of a [[EditPropertyValueCommand#Scan_to_Input|scan to input]] button to trigger property editing. However, the ScanningIsActive binding is more dynamic and can be toggled in realtime, whereas the CallingViewModel.ScanToInput is only applied once when the page is first rendered. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.2|Version 5.2 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.2_(WinX)&amp;diff=30589</id>
		<title>Version 5.2 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.2_(WinX)&amp;diff=30589"/>
				<updated>2026-09-15T12:23:02Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.2.? on 2026-??-?? ===&lt;br /&gt;
* The [[MROCLS_TEXT_TASK|TextTaskClassification]] and [[MROCLS_SIGNATURE_TASK|SignatureTaskClassification]] have now a proper UID.&lt;br /&gt;
* Added [[MROCLS_INTEGER_TASK|IntegerTaskClassification]] and [[MROCLS_INTERFACE_TASK|InterfaceTaskClassification]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.5 on 2026-09-02 {{key press|Store}} ===&lt;br /&gt;
* Fixed the broken string property editing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.4 on 2026-09-01 {{key press|Store}} ===&lt;br /&gt;
* Fixed an issue where clients displayed extremely large or small values using scientific notation.&lt;br /&gt;
* Fixed an issue where, after saving a file with an external editor, you had to refocus UBIK twice before it was automatically committed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.3 on 2026-08-04 {{key press|Store}} ===&lt;br /&gt;
* Fixed a bug that prevented file access within the Pictures/Edit folder, which could cause failures of uploading edited files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.2 on 2026-07-21 {{key press|Store Beta}} ===&lt;br /&gt;
* Added support for [[Login_View#Offline_SSO_Login|Offline SSO Login]], allowing users to securely access the UBIK Client in offline mode after a successful online SSO authentication.&lt;br /&gt;
* Resolved an issue where page transitions can be annoying/distracting.&lt;br /&gt;
* UBIK LABs (Experimental) The update interval for live value updates (LiveValueUpdateIntervalMs) can be configured in profiles.&lt;br /&gt;
* Updated all client localization translations.&lt;br /&gt;
* Fixed an issue where Developer Mode failed to display certain property descriptions.&lt;br /&gt;
* Updated misleading text resources on dialogues to delete an object on the server and to locally discard an object.&lt;br /&gt;
* Fixed an issue where DocumentViewModel.ShowDocumentCommand did not work when combined with InvokeCommandAction.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.2 (WinX)]]&lt;br /&gt;
[[Category:Version 5.2|Version 5.2 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.2 (WinX)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Free Text Annotations that where created in former sessions cannot be selected and therefore cannot be edited any more.&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* Known issues regarding the [[Documents_(Client)#Remember_Document_Settings|Remember Document Settings]] feature:&lt;br /&gt;
** Saving the Zoom value via touch gestures is not supported.&lt;br /&gt;
** Due to a third-party framework issue it can't be guaranteed that saving the Zoom level is always working properly. We reported this issue and will update our solution as soon as it is resolved on their side.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.2 (WinX)]]&lt;br /&gt;
[[Category:Version 5.2|Version 5.2 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.2 (WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30588</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30588"/>
				<updated>2026-09-15T12:17:09Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
* [[XAML_Tips#Default_Tab_Selection|Default tab preselection via the TabSelector]] is now enabled for the standard Mobile Client.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* On some Android devices (Pixel 7A, iSafe 930.1 as we know), the app doesn't recognize the device cameras on the first launch after fresh installations. If this happens, please simply restart the app and it should be fine from then on.&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30587</id>
		<title>Version 5.3 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30587"/>
				<updated>2026-09-15T12:17:01Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30586</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30586"/>
				<updated>2026-09-14T12:36:15Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* TabView */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentArea defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
For new objects, the Properties tab is selected by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
Since {{Version/MobileSince|5.3}}, adding the classification to a metaclass is enough for Mobile. Prior this version, it is additionally necessary to bind the TabSelector to the SelectedIndex as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
     ...&lt;br /&gt;
     SelectedIndex=&amp;quot;{Binding TabSelector}&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The default tab preselection with the TabSelector and the Classifications only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, there need to be some Xaml adaptations in order to work, see [[XAML_Tips#Preselection_of_customized_Tabs|Preselection of customized Tabs]].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|The order of TabItems matters, as the selection is evaluated via the index of the related TabItem.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|If it is required to preselect a tab e.g. based on a MetaClass or Property without the TabSelector functionality, it is also possible to use a DataChangedBehavior with SetPropertyAction, see [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|here]].}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30585</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30585"/>
				<updated>2026-09-14T12:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
* [[XAML_Tips#Default_Tab_Selection|Default tab preselection via the TabSelector]] is now enabled for the standard Mobile Client.&lt;br /&gt;
* The Text and Signature Task Classifications now have a proper UID.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* On some Android devices (Pixel 7A, iSafe 930.1 as we know), the app doesn't recognize the device cameras on the first launch after fresh installations. If this happens, please simply restart the app and it should be fine from then on.&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30584</id>
		<title>Version 5.3 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30584"/>
				<updated>2026-09-14T12:12:24Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
* The Text and Signature Task Classifications now have a proper UID.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30583</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30583"/>
				<updated>2026-09-14T09:54:46Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
* [[XAML_Tips#Default_Tab_Selection|Default tab preselection via the TabSelector]] is now enabled for the standard Mobile Client.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* On some Android devices (Pixel 7A, iSafe 930.1 as we know), the app doesn't recognize the device cameras on the first launch after fresh installations. If this happens, please simply restart the app and it should be fine from then on.&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30582</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30582"/>
				<updated>2026-09-14T08:36:30Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Default Tab Selection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentArea defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
For new objects, the Properties tab is selected by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
Since {{Version/MobileSince|5.3}}, adding the classification to a metaclass is enough for Mobile. Prior this version, it is additionally necessary to bind the TabSelector to the SelectedIndex as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
     ...&lt;br /&gt;
     SelectedIndex=&amp;quot;{Binding TabSelector}&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The default tab preselection with the TabSelector and the Classifications only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, there need to be some Xaml adaptations in order to work, see [[XAML_Tips#Preselection_of_customized_Tabs|Preselection of customized Tabs]].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|The order of TabItems matters, as the selection is evaluated via the index of the related TabItem.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|If it is required to preselect a tab e.g. based on a MetaClass or Property without the TabSelector functionality, it is also possible to use a DataChangedBehavior with SetPropertyAction, see [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|here]].}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30566</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30566"/>
				<updated>2026-09-07T09:57:28Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Preselection of customized Tabs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
For new objects, the Properties tab is selected by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
Since {{Version/MobileSince|5.3}}, adding the classification to a metaclass is enough for Mobile. Prior this version, it is additionally necessary to bind the TabSelector to the SelectedIndex as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
     ...&lt;br /&gt;
     SelectedIndex=&amp;quot;{Binding TabSelector}&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The default tab preselection with the TabSelector and the Classifications only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, there need to be some Xaml adaptations in order to work, see [[XAML_Tips#Preselection_of_customized_Tabs|Preselection of customized Tabs]].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|The order of TabItems matters, as the selection is evaluated via the index of the related TabItem.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|If it is required to preselect a tab e.g. based on a MetaClass or Property without the TabSelector functionality, it is also possible to use a DataChangedBehavior with SetPropertyAction, see [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|here]].}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30565</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30565"/>
				<updated>2026-09-07T08:56:29Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Preselection of customized Tabs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
For new objects, the Properties tab is selected by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
Since {{Version/MobileSince|5.3}}, adding the classification to a metaclass is enough for Mobile. Prior this version, it is additionally necessary to bind the TabSelector to the SelectedIndex as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
     ...&lt;br /&gt;
     SelectedIndex=&amp;quot;{Binding TabSelector}&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The default tab preselection with the TabSelector and the Classifications only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, there need to be some Xaml adaptations in order to work, see [[XAML_Tips#Preselection_of_customized_Tabs|Preselection of customized Tabs]].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|The order of TabItems matters, as the selection is evaluated via the index of the related TabItem.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30564</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30564"/>
				<updated>2026-09-07T08:51:14Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Default Tab Selection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
For new objects, the Properties tab is selected by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
Since {{Version/MobileSince|5.3}}, adding the classification to a metaclass is enough for Mobile. Prior this version, it is additionally necessary to bind the TabSelector to the SelectedIndex as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
     ...&lt;br /&gt;
     SelectedIndex=&amp;quot;{Binding TabSelector}&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The default tab preselection with the TabSelector and the Classifications only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, there need to be some Xaml adaptations in order to work, see [[XAML_Tips#Preselection_of_customized_Tabs|Preselection of customized Tabs]].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30563</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30563"/>
				<updated>2026-09-07T07:59:22Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Default Tab Selection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
Since {{Version/MobileSince|5.3}}, adding the classification to a metaclass is enough for Mobile. Prior this version, it is additionally necessary to bind the TabSelector to the SelectedIndex as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
     ...&lt;br /&gt;
     SelectedIndex=&amp;quot;{Binding TabSelector}&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The default tab preselection with the TabSelector and the Classifications only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, there need to be some Xaml adaptations in order to work, see [[XAML_Tips#Preselection_of_customized_Tabs|Preselection of customized Tabs]].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents - in this order). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30562</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30562"/>
				<updated>2026-09-07T07:34:37Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* TabView */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
tbd!&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30547</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30547"/>
				<updated>2026-09-03T14:41:38Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Preselection of customized Tabs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
tbd!&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...), which only matches the enum index in the default tab set. Once tabs are added, removed, or reordered, the Expression needs to translate each TabSelector value into the tab's actual position in the current layout, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30546</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30546"/>
				<updated>2026-09-03T14:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Preselection of customized Tabs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
tbd!&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (index 0 -&amp;gt; ChildrenTab, index 1 -&amp;gt; PropertiesTab, index 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list, which equals the enum index, starting from 0 (0, 1, 2, ...). So the Expression needs to translate each TabSelector value into the position of the matching tab, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', tab index 1 (Custom Tab) should be selected.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, tab index 0 (Children Tab) should be selected.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), tab index 2 (Properties Tab) should be selected.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (index 0) / Custom Tab (index 1) / Properties Tab (index 2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30545</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30545"/>
				<updated>2026-09-03T14:30:56Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Preselection of customized Tabs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
tbd!&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (0 -&amp;gt; ChildrenTab, 1 -&amp;gt; PropertiesTab, 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...). So the Expression needs to translate each TabSelector value into the position of the matching tab, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
    If the Title of the context object is 'MyObjectTitle', the CustomTabRadioButton should be checked.&lt;br /&gt;
    Otherwise, if the TabSelector enum name is ChildrenTab, the ChildrenTabRadioButton should be checked.&lt;br /&gt;
    And if the TabSelector enum name is anything else (PropertiesTab or DocumentsTab), the PropertiesTabRadioButton should be checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? &amp;amp;quot;CUSTOM&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;CHILDREN&amp;amp;quot; : &amp;amp;quot;PROPERTIES&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CHILDREN}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;CustomTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=CUSTOM}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTabRadioButton&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PROPERTIES}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;MyObjectTitle&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children Tab (0) / Custom Tab (1) / Properties Tab (2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30544</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30544"/>
				<updated>2026-09-03T13:57:51Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Preselection of customized Tabs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
tbd!&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The TabSelector approach shown above only works with the default tab set (Children, Properties, Documents). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on. The example below shows how a customized tab can be preselected in such cases, without losing the functionality of the TabSelector.&lt;br /&gt;
&lt;br /&gt;
{{Hint|TabSelector is an enum (0 -&amp;gt; ChildrenTab, 1 -&amp;gt; PropertiesTab, 2 -&amp;gt; DocumentsTab). In the Mobile Client, tabs are selected by their position in the list (0, 1, 2, ...). So the Expression needs to translate each TabSelector value into the position of the matching tab, as shown in the example below. UWP matches tabs by name instead, so no such mapping is needed there.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;03 Property Editing&amp;amp;quot; ? &amp;amp;quot;TestTab&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;ChildrenTab&amp;amp;quot; : &amp;amp;quot;PropertiesTab&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTab&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=ChildrenTab}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;TestTab&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=TestTab}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTab&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PropertiesTab}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;03 Property Editing&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children(0) / Test Tab(1) / Properties(2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30543</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=XAML_Tips&amp;diff=30543"/>
				<updated>2026-09-03T13:19:52Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* TabView */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Mobile: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Mobile) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Mobile) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Mobile, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Mobile(Xamarin) approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. &lt;br /&gt;
&lt;br /&gt;
{{Attention|The first time you launch CharacterMap you will need to use the button in the bottom right of the selected icon pane to reveal the Xamarin.Forms code generator.}}&lt;br /&gt;
&lt;br /&gt;
With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft] (Maui documentation: [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/shapes/path?view=net-maui-9.0| see here]). Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Maui)&amp;quot;&amp;gt;&lt;br /&gt;
tbd!&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== Preselection of customized Tabs ====&lt;br /&gt;
&lt;br /&gt;
The approach shown above only works with the default tab set (Children, Properties, Documents). If a tab is added, removed, or reordered, this default mechanism can no longer be relied on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression into the content area, processing the x:Name of the tab that should be checked. Bind the expression to every RadioButton's IsChecked.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Name=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Visibility=&amp;quot;Collapsed&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;03 Property Editing&amp;amp;quot; ? &amp;amp;quot;TestTab&amp;amp;quot; : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? &amp;amp;quot;ChildrenTab&amp;amp;quot; : &amp;amp;quot;PropertiesTab&amp;amp;quot;)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;ChildrenTab&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=ChildrenTab}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;TestTab&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=TestTab}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton&lt;br /&gt;
    x:Name=&amp;quot;PropertiesTab&amp;quot;&lt;br /&gt;
    GroupName=&amp;quot;Tabs&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding Path=Result, ElementName=CustomTabSelector, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=PropertiesTab}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(MAUI)&amp;quot;&amp;gt;&lt;br /&gt;
Add an EvalExpression evaluating the tab index, and bind it to the TabView SelectedIndex:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression&lt;br /&gt;
    x:Key=&amp;quot;CustomTabSelector&amp;quot;&lt;br /&gt;
    Context=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Expression=&amp;quot;Title == &amp;amp;quot;03 Property Editing&amp;amp;quot; ? 1 : (TabSelector.ToString() == &amp;amp;quot;ChildrenTab&amp;amp;quot; ? 0 : 2)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;Title&amp;quot; Value=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TabSelector&amp;quot; Value=&amp;quot;{Binding TabSelector}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabView:SfTabView SelectedIndex=&amp;quot;{Binding Source={StaticResource CustomTabSelector}, Path=Result}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- tabView:SfTabItems in the order Children(0) / Test Tab(1) / Properties(2) ... --&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Delayed loading {{Version/WinXSince|4.7}} ===&lt;br /&gt;
By default the FlipView control (UWP only) doesn't have a delayed loading mechanism.&lt;br /&gt;
Imagine if you flip through a large list of documents quickly, the control would actually end up loading every single one of them even if you just want to look at the content of the last one. This has a very negative effect that the app wastes a lot of resources loading documents for nothing, while struggling to display the content you care about. In some extreme case, this can even lead to an app hang/crash.&lt;br /&gt;
&lt;br /&gt;
We added such a delayed loading mechanism to this control. With it, the item content only starts to load when you stay on it for a while (1 second). If you are using the content of UBIKDocumentFlipView.xaml from an older version (before 4.7) and therefore experience such a performance/stability issue, please check the FlipView related section in the newer default templates of it.&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Mobile(Xamarin)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom {{Version/MobileSince|5.0}} ==&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for Mobile Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
== FontIcon does not update when set dynamically using Behaviors ==&lt;br /&gt;
{{Version/WinXSince|4.0}} DataTriggerBehavior does not reliably change the Glyph property of a FontIcon. To recreate in UWP the behavior of dynamically displaying icons based on a binding state, which in Mobile xaml can easily be achieved using a DataTrigger, use TextBlock with the FontFamily set to UBIKSymbols instead. Then, the DataTriggerBehavior can be used normally. An example can be seen in the UBIKPropertyDirectItemMinMax.xaml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Won't Work&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FontIcon Glyph=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Glyph&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{Binding Numpad, Source={StaticResource UBIKIcons}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:DataTriggerBehavior Binding=&amp;quot;{Binding MinMaxType, Converter={StaticResource EqualToTrueConverter}, ConverterParameter=Min}&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;core:ChangePropertyAction PropertyName=&amp;quot;Text&amp;quot; Value=&amp;quot;{Binding DownLined, Source={StaticResource UBIKIcons}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:Mobile|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30510</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30510"/>
				<updated>2026-08-31T11:06:19Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Known issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
=== Flashlight  {{Version/MobileSince|5.1.0}}  ===&lt;br /&gt;
For the Mobile clients, it is possible to control the system flashlight via customizing and switch it on or off.&lt;br /&gt;
&lt;br /&gt;
The available properties can, for example, be bound to a Switch or CheckBox, as demonstrated below. These properties allow you to:&lt;br /&gt;
* Determine whether the device supports flashlight functionality (IsFlashSupported)&lt;br /&gt;
* Check whether the flashlight is currently turned on or off (IsFlashEnabled)&lt;br /&gt;
* Toggle the flashlight on or off via user interaction (SwitchFlashLight) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If an attempt is made to enable the flashlight on a device that does not provide flashlight support, no action is performed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Switch&lt;br /&gt;
! controls:CheckBox&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Switch IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
        IsToggled=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:CheckBox&lt;br /&gt;
    x:Name=&amp;quot;PropertyToggle&amp;quot;&lt;br /&gt;
    CheckSymbol=&amp;quot;&amp;amp;#x1F526;&amp;quot;&lt;br /&gt;
    IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource UBIKIconToggleButton}&amp;quot;&lt;br /&gt;
    SymbolSize=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding AppStatus.IsFlashEnabled}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;controls:CheckBox&amp;quot;&lt;br /&gt;
            Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
   &amp;lt;/controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:CheckBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/multibinding?view=net-maui-10.0 MultiBinding] instead of multiple labels. &lt;br /&gt;
** Avoid Label.FormattedText on ItemTemplates as this can cause issues in lists with many items.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} ====&lt;br /&gt;
&lt;br /&gt;
A DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a Maui-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Maui ranks a value applied by an active DataTrigger's Setter higher than a manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true.}}&lt;br /&gt;
&lt;br /&gt;
One common use case that cannot be used directly in Maui is [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|Pre-selecting a tab based on a metaclass or property]].&lt;br /&gt;
&lt;br /&gt;
As a workaround, do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing '''DataChangedBehavior''' and '''SetPropertyAction''' pattern instead. For an example click [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|here]].&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, for example:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, ListView.SelectedItem, RadioButton.IsChecked&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
{{Hint|Use a DataChangedBehavior with SetPropertyAction instead of a DataTrigger if the property it sets should remain user-changeable afterwards. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tooltips not supported on mobile iOS devices {{Version/MobileSince|5.0}} ===&lt;br /&gt;
On iOS, native tooltips are only supported under very specific conditions. According to the official [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/tooltips?view=net-maui-10.0| Microsoft documentation], tooltips are only shown when running the app on macOS with a pointer device. On physical iPhones and iPads, tooltips are generally not displayed. This means that using ToolTipProperties in XAML will not work reliably on iOS mobile devices.&lt;br /&gt;
&lt;br /&gt;
A possible workaround is to simulate tooltip behavior using a [https://help.syncfusion.com/maui/popup/overview| SfPopup control]. The idea is to use a tap interaction on the UI element (e.g., via a ''TappedBehavior'' with a ''SetPropertyAction'') that opens a Popup positioned relative to that element, and to automatically close the Popup after a short duration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- AFTER WORKAROUND --&amp;gt;&lt;br /&gt;
xmlns:sfPopup=&amp;quot;clr-namespace:Syncfusion.Maui.Popup;assembly=Syncfusion.Maui.Popup&amp;quot;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sfPopup:SfPopup&lt;br /&gt;
    x:Name=&amp;quot;TooltipTextPopup&amp;quot;&lt;br /&gt;
    AutoCloseDuration=&amp;quot;3000&amp;quot;&lt;br /&gt;
    RelativePosition=&amp;quot;AlignTop&amp;quot;&lt;br /&gt;
    RelativeView=&amp;quot;{x:Reference YourUIElement}&amp;quot;&lt;br /&gt;
    ShowHeader=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
                &amp;lt;Label Text=&amp;quot;This will be displayed as Tooltip text&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/sfPopup:SfPopup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Border.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
                PropertyName=&amp;quot;IsOpen&amp;quot;&lt;br /&gt;
                TargetObject=&amp;quot;{Binding Source={x:Reference TooltipTextPopup}}&amp;quot;&lt;br /&gt;
                Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Border.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- BEFORE WORKAROUND --&amp;gt;&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ToolTipProperties.Text&amp;gt;&lt;br /&gt;
         This will NOT be shown on iOS&lt;br /&gt;
    &amp;lt;/ToolTipProperties.Text&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKHighlightColor is a secondary accent color used for highlighting (eg. Multiselect mode or edited Property). {{Version/MobileSince|5.1.0.0}} Transparency has been added to the UBIKHighlightColor.&lt;br /&gt;
** UBIKGradientColor {{Version/MobileSince|5.1.0.0}} is used in combination with UBIKAccentColor to form a gradient on the Authentication area.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). &lt;br /&gt;
*** The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
*** However, this will interfere with lists that rely on the SelectionBackground to highlight selection. This is solved in various ways throughout the UI, such as the SelectedIndicator used in UBIKChildItem, or the seperate SelectedItem and SelectedItemTemplate templates used in UBIKEditGuid.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30509</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30509"/>
				<updated>2026-08-31T11:05:12Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* UBIKTabView */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Pre-selecting a tab based on a metaclass or property ====&lt;br /&gt;
&lt;br /&gt;
In Maui, an active DataTrigger permanently blocks the user from manually switching tabs. For this reason, instead of using a DataTrigger to set the SelectedIndex, a DataChangedBehavior with SetPropertyAction should be used, which sets SelectedIndex once when the relevant data changes and leaves the tab freely user-changeable afterwards.&lt;br /&gt;
&lt;br /&gt;
See [[Mobile_XAML#DataTrigger_permanently_blocks_manual_changes|XAML Known Issues: DataTrigger permanently blocks manual changes]] for the full explanation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The DataChangedBehavior and SetPropertyAction Binding, ConverterParameter, and Value need to match the target tab index and condition for the specific customizing. The SetPropertyAction TargetObject must reference the UBIKTabView via x:Reference (e.g. x:Name=&amp;quot;ContentTabs&amp;quot; on the UBIKTabView).&lt;br /&gt;
&lt;br /&gt;
{{Attention|This replacement applies to any property a DataTrigger sets that should stay user-changeable afterwards, not just SelectedIndex on a TabView, see [[Mobile_XAML#DataTrigger_permanently_blocks_manual_changes|XAML Known Issues: DataTrigger permanently blocks manual changes]] for other affected controls and scenarios.}}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30502</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30502"/>
				<updated>2026-08-27T07:44:56Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* Fixed an issue where clients displayed extremely large or small values using scientific notation.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30501</id>
		<title>Version 5.3 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30501"/>
				<updated>2026-08-27T07:44:15Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.3.? on 202?-??-?? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
* Fixed an issue where clients displayed extremely large or small values using scientific notation.&lt;br /&gt;
* The Client now displays a proper toast message when the CopyToClipboardCommand is performed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30495</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30495"/>
				<updated>2026-08-26T12:56:33Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
=== Flashlight  {{Version/MobileSince|5.1.0}}  ===&lt;br /&gt;
For the Mobile clients, it is possible to control the system flashlight via customizing and switch it on or off.&lt;br /&gt;
&lt;br /&gt;
The available properties can, for example, be bound to a Switch or CheckBox, as demonstrated below. These properties allow you to:&lt;br /&gt;
* Determine whether the device supports flashlight functionality (IsFlashSupported)&lt;br /&gt;
* Check whether the flashlight is currently turned on or off (IsFlashEnabled)&lt;br /&gt;
* Toggle the flashlight on or off via user interaction (SwitchFlashLight) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If an attempt is made to enable the flashlight on a device that does not provide flashlight support, no action is performed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Switch&lt;br /&gt;
! controls:CheckBox&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Switch IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
        IsToggled=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:CheckBox&lt;br /&gt;
    x:Name=&amp;quot;PropertyToggle&amp;quot;&lt;br /&gt;
    CheckSymbol=&amp;quot;&amp;amp;#x1F526;&amp;quot;&lt;br /&gt;
    IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource UBIKIconToggleButton}&amp;quot;&lt;br /&gt;
    SymbolSize=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding AppStatus.IsFlashEnabled}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;controls:CheckBox&amp;quot;&lt;br /&gt;
            Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
   &amp;lt;/controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:CheckBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/multibinding?view=net-maui-10.0 MultiBinding] instead of multiple labels. &lt;br /&gt;
** Avoid Label.FormattedText on ItemTemplates as this can cause issues in lists with many items.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} ====&lt;br /&gt;
&lt;br /&gt;
A DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a Maui-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Maui ranks a value applied by an active DataTrigger's Setter higher than a manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true.}}&lt;br /&gt;
&lt;br /&gt;
One common use case that cannot be used directly in Maui is [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|Pre-selecting a tab based on a metaclass or property]].&lt;br /&gt;
&lt;br /&gt;
As a workaround, do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing '''DataChangedBehavior''' and '''SetPropertyAction''' pattern instead. For an example click [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Pre-selecting_a_tab_based_on_a_metaclass_or_property|here]].&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, for example:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, ListView.SelectedItem, RadioButton.IsChecked&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
{{Hint|Use a DataChangedBehavior with SetPropertyAction instead of a DataTrigger if the property it sets should remain user-changeable afterwards. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tooltips not supported on mobile iOS devices {{Version/MobileSince|5.0}} ===&lt;br /&gt;
On iOS, native tooltips are only supported under very specific conditions. According to the official [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/tooltips?view=net-maui-10.0| Microsoft documentation], tooltips are only shown when running the app on macOS with a pointer device. On physical iPhones and iPads, tooltips are generally not displayed. This means that using ToolTipProperties in XAML will not work reliably on iOS mobile devices.&lt;br /&gt;
&lt;br /&gt;
A possible workaround is to simulate tooltip behavior using a [https://help.syncfusion.com/maui/popup/overview| SfPopup control]. The idea is to use a tap interaction on the UI element (e.g., via a ''TappedBehavior'' with a ''SetPropertyAction'') that opens a Popup positioned relative to that element, and to automatically close the Popup after a short duration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- AFTER WORKAROUND --&amp;gt;&lt;br /&gt;
xmlns:sfPopup=&amp;quot;clr-namespace:Syncfusion.Maui.Popup;assembly=Syncfusion.Maui.Popup&amp;quot;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sfPopup:SfPopup&lt;br /&gt;
    x:Name=&amp;quot;TooltipTextPopup&amp;quot;&lt;br /&gt;
    AutoCloseDuration=&amp;quot;3000&amp;quot;&lt;br /&gt;
    RelativePosition=&amp;quot;AlignTop&amp;quot;&lt;br /&gt;
    RelativeView=&amp;quot;{x:Reference YourUIElement}&amp;quot;&lt;br /&gt;
    ShowHeader=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
                &amp;lt;Label Text=&amp;quot;This will be displayed as Tooltip text&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/sfPopup:SfPopup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Border.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
                PropertyName=&amp;quot;IsOpen&amp;quot;&lt;br /&gt;
                TargetObject=&amp;quot;{Binding Source={x:Reference TooltipTextPopup}}&amp;quot;&lt;br /&gt;
                Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Border.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- BEFORE WORKAROUND --&amp;gt;&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ToolTipProperties.Text&amp;gt;&lt;br /&gt;
         This will NOT be shown on iOS&lt;br /&gt;
    &amp;lt;/ToolTipProperties.Text&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKHighlightColor is a secondary accent color used for highlighting (eg. Multiselect mode or edited Property). {{Version/MobileSince|5.1.0.0}} Transparency has been added to the UBIKHighlightColor.&lt;br /&gt;
** UBIKGradientColor {{Version/MobileSince|5.1.0.0}} is used in combination with UBIKAccentColor to form a gradient on the Authentication area.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). &lt;br /&gt;
*** The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
*** However, this will interfere with lists that rely on the SelectionBackground to highlight selection. This is solved in various ways throughout the UI, such as the SelectedIndicator used in UBIKChildItem, or the seperate SelectedItem and SelectedItemTemplate templates used in UBIKEditGuid.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30494</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30494"/>
				<updated>2026-08-26T12:34:52Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Pre-selecting a tab based on a metaclass or property */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&lt;br /&gt;
==== Pre-selecting a tab based on a metaclass or property ====&lt;br /&gt;
&lt;br /&gt;
In Maui, an active DataTrigger permanently blocks the user from manually switching tabs. For this reason, instead of using a DataTrigger to set the SelectedIndex, a DataChangedBehavior with SetPropertyAction should be used, which sets SelectedIndex once when the relevant data changes and leaves the tab freely user-changeable afterwards.&lt;br /&gt;
&lt;br /&gt;
See [[Mobile_XAML#DataTrigger_permanently_blocks_manual_changes|XAML Known Issues: DataTrigger permanently blocks manual changes]] for the full explanation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The DataChangedBehavior and SetPropertyAction Binding, ConverterParameter, and Value need to match the target tab index and condition for the specific customizing. The SetPropertyAction TargetObject must reference the UBIKTabView via x:Reference (e.g. x:Name=&amp;quot;ContentTabs&amp;quot; on the UBIKTabView).&lt;br /&gt;
&lt;br /&gt;
{{Attention|This replacement applies to any property a DataTrigger sets that should stay user-changeable afterwards, not just SelectedIndex on a TabView, see [[Mobile_XAML#DataTrigger_permanently_blocks_manual_changes|XAML Known Issues: DataTrigger permanently blocks manual changes]] for other affected controls and scenarios.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30493</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30493"/>
				<updated>2026-08-26T12:16:00Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* DataTrigger permanently blocks manual changes (use DataChangedBehavior instead) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&lt;br /&gt;
==== Pre-selecting a tab based on a metaclass or property ====&lt;br /&gt;
&lt;br /&gt;
In Maui, an active DataTrigger permanently blocks the user from manually switching tabs. For this reason, instead of using a DataTrigger to set the SelectedIndex, a DataChangedBehavior with SetPropertyAction should be used instead, which sets SelectedIndex once when the relevant data changes and leaves the tab freely user-changeable afterwards.&lt;br /&gt;
&lt;br /&gt;
See [[Mobile_XAML#DataTrigger_permanently_blocks_manual_changes|XAML Known Issues: DataTrigger permanently blocks manual changes]] for the full explanation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The DataChangedBehavior and SetPropertyAction Binding, ConverterParameter, and Value need to match the target tab index and condition for the specific customizing. The SetPropertyAction TargetObject must reference the UBIKTabView via x:Reference (e.g. x:Name=&amp;quot;ContentTabs&amp;quot; on the UBIKTabView).&lt;br /&gt;
&lt;br /&gt;
{{Attention|This replacement applies to any property a DataTrigger sets that should stay user-changeable afterwards, not just SelectedIndex on a TabView, see [[Mobile_XAML#DataTrigger_permanently_blocks_manual_changes|XAML Known Issues: DataTrigger permanently blocks manual changes]] for other affected controls and scenarios.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30492</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30492"/>
				<updated>2026-08-26T10:33:18Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
=== Flashlight  {{Version/MobileSince|5.1.0}}  ===&lt;br /&gt;
For the Mobile clients, it is possible to control the system flashlight via customizing and switch it on or off.&lt;br /&gt;
&lt;br /&gt;
The available properties can, for example, be bound to a Switch or CheckBox, as demonstrated below. These properties allow you to:&lt;br /&gt;
* Determine whether the device supports flashlight functionality (IsFlashSupported)&lt;br /&gt;
* Check whether the flashlight is currently turned on or off (IsFlashEnabled)&lt;br /&gt;
* Toggle the flashlight on or off via user interaction (SwitchFlashLight) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If an attempt is made to enable the flashlight on a device that does not provide flashlight support, no action is performed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Switch&lt;br /&gt;
! controls:CheckBox&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Switch IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
        IsToggled=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:CheckBox&lt;br /&gt;
    x:Name=&amp;quot;PropertyToggle&amp;quot;&lt;br /&gt;
    CheckSymbol=&amp;quot;&amp;amp;#x1F526;&amp;quot;&lt;br /&gt;
    IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource UBIKIconToggleButton}&amp;quot;&lt;br /&gt;
    SymbolSize=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding AppStatus.IsFlashEnabled}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;controls:CheckBox&amp;quot;&lt;br /&gt;
            Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
   &amp;lt;/controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:CheckBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/multibinding?view=net-maui-10.0 MultiBinding] instead of multiple labels. &lt;br /&gt;
** Avoid Label.FormattedText on ItemTemplates as this can cause issues in lists with many items.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
==== DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} ====&lt;br /&gt;
&lt;br /&gt;
A DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a Maui-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Maui ranks a value applied by an active DataTrigger's Setter higher than a manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true.}}&lt;br /&gt;
&lt;br /&gt;
In the example below a DataTrigger is used to set the selected tab based on the record's metaclass. The initial selection works correctly, but afterwards the user can never manually switch to a different tab. Tapping another tab header highlights it, but the content never switches, and SelectedIndex silently reverts.&lt;br /&gt;
&lt;br /&gt;
As a workaround, do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing '''DataChangedBehavior''' and '''SetPropertyAction''' pattern instead.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, for example:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, ListView.SelectedItem, RadioButton.IsChecked&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
{{Hint|Use a DataChangedBehavior with SetPropertyAction instead of a DataTrigger if the property it sets should remain user-changeable afterwards. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tooltips not supported on mobile iOS devices {{Version/MobileSince|5.0}} ===&lt;br /&gt;
On iOS, native tooltips are only supported under very specific conditions. According to the official [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/tooltips?view=net-maui-10.0| Microsoft documentation], tooltips are only shown when running the app on macOS with a pointer device. On physical iPhones and iPads, tooltips are generally not displayed. This means that using ToolTipProperties in XAML will not work reliably on iOS mobile devices.&lt;br /&gt;
&lt;br /&gt;
A possible workaround is to simulate tooltip behavior using a [https://help.syncfusion.com/maui/popup/overview| SfPopup control]. The idea is to use a tap interaction on the UI element (e.g., via a ''TappedBehavior'' with a ''SetPropertyAction'') that opens a Popup positioned relative to that element, and to automatically close the Popup after a short duration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- AFTER WORKAROUND --&amp;gt;&lt;br /&gt;
xmlns:sfPopup=&amp;quot;clr-namespace:Syncfusion.Maui.Popup;assembly=Syncfusion.Maui.Popup&amp;quot;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sfPopup:SfPopup&lt;br /&gt;
    x:Name=&amp;quot;TooltipTextPopup&amp;quot;&lt;br /&gt;
    AutoCloseDuration=&amp;quot;3000&amp;quot;&lt;br /&gt;
    RelativePosition=&amp;quot;AlignTop&amp;quot;&lt;br /&gt;
    RelativeView=&amp;quot;{x:Reference YourUIElement}&amp;quot;&lt;br /&gt;
    ShowHeader=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
                &amp;lt;Label Text=&amp;quot;This will be displayed as Tooltip text&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/sfPopup:SfPopup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Border.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
                PropertyName=&amp;quot;IsOpen&amp;quot;&lt;br /&gt;
                TargetObject=&amp;quot;{Binding Source={x:Reference TooltipTextPopup}}&amp;quot;&lt;br /&gt;
                Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Border.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- BEFORE WORKAROUND --&amp;gt;&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ToolTipProperties.Text&amp;gt;&lt;br /&gt;
         This will NOT be shown on iOS&lt;br /&gt;
    &amp;lt;/ToolTipProperties.Text&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKHighlightColor is a secondary accent color used for highlighting (eg. Multiselect mode or edited Property). {{Version/MobileSince|5.1.0.0}} Transparency has been added to the UBIKHighlightColor.&lt;br /&gt;
** UBIKGradientColor {{Version/MobileSince|5.1.0.0}} is used in combination with UBIKAccentColor to form a gradient on the Authentication area.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). &lt;br /&gt;
*** The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
*** However, this will interfere with lists that rely on the SelectionBackground to highlight selection. This is solved in various ways throughout the UI, such as the SelectedIndicator used in UBIKChildItem, or the seperate SelectedItem and SelectedItemTemplate templates used in UBIKEditGuid.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30491</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30491"/>
				<updated>2026-08-26T10:19:15Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
=== Flashlight  {{Version/MobileSince|5.1.0}}  ===&lt;br /&gt;
For the Mobile clients, it is possible to control the system flashlight via customizing and switch it on or off.&lt;br /&gt;
&lt;br /&gt;
The available properties can, for example, be bound to a Switch or CheckBox, as demonstrated below. These properties allow you to:&lt;br /&gt;
* Determine whether the device supports flashlight functionality (IsFlashSupported)&lt;br /&gt;
* Check whether the flashlight is currently turned on or off (IsFlashEnabled)&lt;br /&gt;
* Toggle the flashlight on or off via user interaction (SwitchFlashLight) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If an attempt is made to enable the flashlight on a device that does not provide flashlight support, no action is performed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Switch&lt;br /&gt;
! controls:CheckBox&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Switch IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
        IsToggled=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:CheckBox&lt;br /&gt;
    x:Name=&amp;quot;PropertyToggle&amp;quot;&lt;br /&gt;
    CheckSymbol=&amp;quot;&amp;amp;#x1F526;&amp;quot;&lt;br /&gt;
    IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource UBIKIconToggleButton}&amp;quot;&lt;br /&gt;
    SymbolSize=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding AppStatus.IsFlashEnabled}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;controls:CheckBox&amp;quot;&lt;br /&gt;
            Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
   &amp;lt;/controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:CheckBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/multibinding?view=net-maui-10.0 MultiBinding] instead of multiple labels. &lt;br /&gt;
** Avoid Label.FormattedText on ItemTemplates as this can cause issues in lists with many items.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} ===&lt;br /&gt;
&lt;br /&gt;
A DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a Maui-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Maui ranks a value applied by an active DataTrigger's Setter higher than a manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true.}}&lt;br /&gt;
&lt;br /&gt;
In the example below a DataTrigger is used to set the selected tab based on the record's metaclass. The initial selection works correctly, but afterwards the user can never manually switch to a different tab. Tapping another tab header highlights it, but the content never switches, and SelectedIndex silently reverts.&lt;br /&gt;
&lt;br /&gt;
As a workaround, do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing '''DataChangedBehavior''' and '''SetPropertyAction''' pattern instead.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, for example:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, ListView.SelectedItem, RadioButton.IsChecked&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
{{Hint|Use a DataChangedBehavior with SetPropertyAction instead of a DataTrigger if the property it sets should remain user-changeable afterwards. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tooltips not supported on mobile iOS devices {{Version/MobileSince|5.0}} ===&lt;br /&gt;
On iOS, native tooltips are only supported under very specific conditions. According to the official [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/tooltips?view=net-maui-10.0| Microsoft documentation], tooltips are only shown when running the app on macOS with a pointer device. On physical iPhones and iPads, tooltips are generally not displayed. This means that using ToolTipProperties in XAML will not work reliably on iOS mobile devices.&lt;br /&gt;
&lt;br /&gt;
A possible workaround is to simulate tooltip behavior using a [https://help.syncfusion.com/maui/popup/overview| SfPopup control]. The idea is to use a tap interaction on the UI element (e.g., via a ''TappedBehavior'' with a ''SetPropertyAction'') that opens a Popup positioned relative to that element, and to automatically close the Popup after a short duration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- AFTER WORKAROUND --&amp;gt;&lt;br /&gt;
xmlns:sfPopup=&amp;quot;clr-namespace:Syncfusion.Maui.Popup;assembly=Syncfusion.Maui.Popup&amp;quot;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sfPopup:SfPopup&lt;br /&gt;
    x:Name=&amp;quot;TooltipTextPopup&amp;quot;&lt;br /&gt;
    AutoCloseDuration=&amp;quot;3000&amp;quot;&lt;br /&gt;
    RelativePosition=&amp;quot;AlignTop&amp;quot;&lt;br /&gt;
    RelativeView=&amp;quot;{x:Reference YourUIElement}&amp;quot;&lt;br /&gt;
    ShowHeader=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
                &amp;lt;Label Text=&amp;quot;This will be displayed as Tooltip text&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/sfPopup:SfPopup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Border.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
                PropertyName=&amp;quot;IsOpen&amp;quot;&lt;br /&gt;
                TargetObject=&amp;quot;{Binding Source={x:Reference TooltipTextPopup}}&amp;quot;&lt;br /&gt;
                Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Border.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- BEFORE WORKAROUND --&amp;gt;&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ToolTipProperties.Text&amp;gt;&lt;br /&gt;
         This will NOT be shown on iOS&lt;br /&gt;
    &amp;lt;/ToolTipProperties.Text&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKHighlightColor is a secondary accent color used for highlighting (eg. Multiselect mode or edited Property). {{Version/MobileSince|5.1.0.0}} Transparency has been added to the UBIKHighlightColor.&lt;br /&gt;
** UBIKGradientColor {{Version/MobileSince|5.1.0.0}} is used in combination with UBIKAccentColor to form a gradient on the Authentication area.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). &lt;br /&gt;
*** The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
*** However, this will interfere with lists that rely on the SelectionBackground to highlight selection. This is solved in various ways throughout the UI, such as the SelectedIndicator used in UBIKChildItem, or the seperate SelectedItem and SelectedItemTemplate templates used in UBIKEditGuid.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30490</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Mobile_XAML&amp;diff=30490"/>
				<updated>2026-08-26T10:12:03Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* DataTrigger Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
=== Flashlight  {{Version/MobileSince|5.1.0}}  ===&lt;br /&gt;
For the Mobile clients, it is possible to control the system flashlight via customizing and switch it on or off.&lt;br /&gt;
&lt;br /&gt;
The available properties can, for example, be bound to a Switch or CheckBox, as demonstrated below. These properties allow you to:&lt;br /&gt;
* Determine whether the device supports flashlight functionality (IsFlashSupported)&lt;br /&gt;
* Check whether the flashlight is currently turned on or off (IsFlashEnabled)&lt;br /&gt;
* Toggle the flashlight on or off via user interaction (SwitchFlashLight) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If an attempt is made to enable the flashlight on a device that does not provide flashlight support, no action is performed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Switch&lt;br /&gt;
! controls:CheckBox&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Switch IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
        IsToggled=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:CheckBox&lt;br /&gt;
    x:Name=&amp;quot;PropertyToggle&amp;quot;&lt;br /&gt;
    CheckSymbol=&amp;quot;&amp;amp;#x1F526;&amp;quot;&lt;br /&gt;
    IsVisible=&amp;quot;{Binding AppStatus.IsFlashSupported}&amp;quot;&lt;br /&gt;
    IsChecked=&amp;quot;{Binding AppStatus.SwitchFlashLight, Mode=TwoWay}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource UBIKIconToggleButton}&amp;quot;&lt;br /&gt;
    SymbolSize=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding AppStatus.IsFlashEnabled}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;controls:CheckBox&amp;quot;&lt;br /&gt;
            Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
   &amp;lt;/controls:CheckBox.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:CheckBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/multibinding?view=net-maui-10.0 MultiBinding] instead of multiple labels. &lt;br /&gt;
** Avoid Label.FormattedText on ItemTemplates as this can cause issues in lists with many items.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== DataTrigger permanently blocks manual changes {{Version/MobileSince|5.0.0}} ===&lt;br /&gt;
&lt;br /&gt;
A DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a Maui-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Maui ranks a value applied by an active DataTrigger's Setter higher than a manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true.}}&lt;br /&gt;
&lt;br /&gt;
In the example below a DataTrigger is used to set the selected tab based on the record's metaclass. The initial selection works correctly, but afterwards the user can never manually switch to a different tab. Tapping another tab header highlights it, but the content never switches, and SelectedIndex silently reverts.&lt;br /&gt;
&lt;br /&gt;
'''Workaround:''' Do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing '''DataChangedBehavior''' and '''SetPropertyAction''' pattern instead.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, e.g.:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, CollectionView/ListView.SelectedItem, RadioButton.IsChecked, Shell.CurrentItem&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
{{Hint|When converting a Xamarin DataTrigger, if the property it sets should remain user-changeable afterwards, convert it into a DataChangedBehavior with SetPropertyAction. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tooltips not supported on mobile iOS devices {{Version/MobileSince|5.0}} ===&lt;br /&gt;
On iOS, native tooltips are only supported under very specific conditions. According to the official [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/tooltips?view=net-maui-10.0| Microsoft documentation], tooltips are only shown when running the app on macOS with a pointer device. On physical iPhones and iPads, tooltips are generally not displayed. This means that using ToolTipProperties in XAML will not work reliably on iOS mobile devices.&lt;br /&gt;
&lt;br /&gt;
A possible workaround is to simulate tooltip behavior using a [https://help.syncfusion.com/maui/popup/overview| SfPopup control]. The idea is to use a tap interaction on the UI element (e.g., via a ''TappedBehavior'' with a ''SetPropertyAction'') that opens a Popup positioned relative to that element, and to automatically close the Popup after a short duration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- AFTER WORKAROUND --&amp;gt;&lt;br /&gt;
xmlns:sfPopup=&amp;quot;clr-namespace:Syncfusion.Maui.Popup;assembly=Syncfusion.Maui.Popup&amp;quot;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sfPopup:SfPopup&lt;br /&gt;
    x:Name=&amp;quot;TooltipTextPopup&amp;quot;&lt;br /&gt;
    AutoCloseDuration=&amp;quot;3000&amp;quot;&lt;br /&gt;
    RelativePosition=&amp;quot;AlignTop&amp;quot;&lt;br /&gt;
    RelativeView=&amp;quot;{x:Reference YourUIElement}&amp;quot;&lt;br /&gt;
    ShowHeader=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
                &amp;lt;Label Text=&amp;quot;This will be displayed as Tooltip text&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/sfPopup:SfPopup.ContentTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/sfPopup:SfPopup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Border.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
                PropertyName=&amp;quot;IsOpen&amp;quot;&lt;br /&gt;
                TargetObject=&amp;quot;{Binding Source={x:Reference TooltipTextPopup}}&amp;quot;&lt;br /&gt;
                Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:TappedBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Border.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- BEFORE WORKAROUND --&amp;gt;&lt;br /&gt;
&amp;lt;Border x:Name=&amp;quot;YourUIElement&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ToolTipProperties.Text&amp;gt;&lt;br /&gt;
         This will NOT be shown on iOS&lt;br /&gt;
    &amp;lt;/ToolTipProperties.Text&amp;gt;&lt;br /&gt;
&amp;lt;/Border&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKHighlightColor is a secondary accent color used for highlighting (eg. Multiselect mode or edited Property). {{Version/MobileSince|5.1.0.0}} Transparency has been added to the UBIKHighlightColor.&lt;br /&gt;
** UBIKGradientColor {{Version/MobileSince|5.1.0.0}} is used in combination with UBIKAccentColor to form a gradient on the Authentication area.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). &lt;br /&gt;
*** The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
*** However, this will interfere with lists that rely on the SelectionBackground to highlight selection. This is solved in various ways throughout the UI, such as the SelectedIndicator used in UBIKChildItem, or the seperate SelectedItem and SelectedItemTemplate templates used in UBIKEditGuid.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30489</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30489"/>
				<updated>2026-08-26T07:27:41Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* DataTrigger permanently blocks manual changes (use DataChangedBehavior instead) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger permanently blocks manual changes (use DataChangedBehavior instead) ===&lt;br /&gt;
&lt;br /&gt;
In .NET MAUI, a DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a MAUI-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
{{Hint|MAUI ranks a value applied by an active DataTrigger's Setter higher than a plain manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true.}}&lt;br /&gt;
&lt;br /&gt;
In the example below a DataTrigger is used to set the selected tab based on the record's metaclass. The initial selection works correctly, but afterwards the user can never manually switch to a different tab. Tapping another tab header highlights it, but the content never switches, and SelectedIndex silently reverts.&lt;br /&gt;
&lt;br /&gt;
'''Workaround:''' Do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing DataChangedBehavior and SetPropertyAction pattern instead.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, e.g.:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, CollectionView/ListView.SelectedItem, RadioButton.IsChecked, Shell.CurrentItem&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
{{Hint|When converting a Xamarin DataTrigger, if the property it sets should remain user-changeable afterwards, convert it into a DataChangedBehavior with SetPropertyAction. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30483</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=30483"/>
				<updated>2026-08-25T12:13:25Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Highly Recommended */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger permanently blocks manual changes (use DataChangedBehavior instead) ===&lt;br /&gt;
&lt;br /&gt;
In .NET MAUI, a DataTrigger that sets a property the user can also change interactively will permanently block that manual change as long as the trigger's condition stays true. This did not happen in Xamarin - it is a MAUI-specific behavior change.&lt;br /&gt;
&lt;br /&gt;
'''Symptom:''' A DataTrigger is used to set e.g. the selected tab based on the record's metaclass. The initial selection works correctly, but afterwards the user can never manually switch to a different tab - tapping another tab header highlights it, but the content never switches and SelectedIndex silently reverts.&lt;br /&gt;
&lt;br /&gt;
'''Cause (short version):''' MAUI ranks a value applied by an active DataTrigger's Setter higher than a plain manual property write (e.g. a user's tap). Every manual write attempt is silently discarded while the trigger's condition remains true - no error, no exception, it just never takes effect.&lt;br /&gt;
&lt;br /&gt;
'''Workaround:''' Do not use DataTrigger for a property that should be data-driven once and then freely user-editable afterwards. Use the existing DataChangedBehavior and SetPropertyAction pattern instead - it performs a single, plain, imperative write the moment the underlying data changes, and never competes with later manual changes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKTabView&amp;quot;&lt;br /&gt;
                 Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
                 Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behaviors:DataChangedBehavior&lt;br /&gt;
        Binding=&amp;quot;{Binding Content.MetaUID, Converter={StaticResource EqualityToBool}, ConverterParameter='b82accb3-7437-429d-aed9-08dfdd5a9e59'}&amp;quot;&lt;br /&gt;
        ComparisonCondition=&amp;quot;Equal&amp;quot;&lt;br /&gt;
        Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:SetPropertyAction&lt;br /&gt;
            PropertyName=&amp;quot;SelectedIndex&amp;quot;&lt;br /&gt;
            TargetObject=&amp;quot;{Binding Source={x:Reference ContentTabs}}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behaviors:DataChangedBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Result: the tab still auto-selects correctly based on the data, and the user can freely switch tabs afterward.&lt;br /&gt;
&lt;br /&gt;
{{Attention|This is not limited to tab selection. The same problem can occur wherever a DataTrigger, Trigger, MultiTrigger sets a property that a user (or code-behind) is also meant to change afterwards, e.g.:}}&lt;br /&gt;
* Selection controls: Picker.SelectedIndex/SelectedItem, CollectionView/ListView.SelectedItem, RadioButton.IsChecked, Shell.CurrentItem&lt;br /&gt;
* Toggle/input controls: Switch.IsToggled, CheckBox.IsChecked, Entry/Editor.Text&lt;br /&gt;
* Expand/collapse state on any control the user can also expand/collapse manually&lt;br /&gt;
* Implicit/global Style.Triggers - the riskiest case, since it silently affects every control of that type on a page&lt;br /&gt;
* Code-behind writes executed after the trigger has already applied a value (not just touch input)&lt;br /&gt;
&lt;br /&gt;
'''Rule of thumb:''' when converting a Xamarin DataTrigger, if the property it sets should remain user-changeable afterwards, convert it into a DataChangedBehavior with SetPropertyAction. Keep DataTrigger/Style.Triggers only for properties that should stay continuously data-driven and don't conflict with user input.&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=List_of_Versions&amp;diff=30366</id>
		<title>List of Versions</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=List_of_Versions&amp;diff=30366"/>
				<updated>2026-07-30T08:55:37Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:IC_MainPage-20.png]] '''Future versions'''&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;table&amp;quot; style=&amp;quot;width:100%;&amp;quot;&amp;gt;&lt;br /&gt;
{{Item/Version|2026-??-??| {{Version/Server|5.2.0}}}}&lt;br /&gt;
{{Item/Version|202?-??-??| {{Version/WinX|5.3}}}}&lt;br /&gt;
{{Item/Version|202?-??-??| {{Version/Mobile|5.3}}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Check mark}} '''Released versions'''&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;table&amp;quot; style=&amp;quot;width:100%;&amp;quot;&amp;gt;&lt;br /&gt;
{{Item/Version|2026-07-21| {{Version/WinX|5.2}}}}&lt;br /&gt;
{{Item/Version|2026-07-21| {{Version/Mobile|5.2}}}}&lt;br /&gt;
{{Item/Version|2026-07-13| {{Version/Server|5.1.0}}}} Service Pack&lt;br /&gt;
{{Item/Version|2026-04-01| {{Version/Server|5.1.0}}}}&lt;br /&gt;
{{Item/Version|2026-02-10| {{Version/WinX|5.1}}}}&lt;br /&gt;
{{Item/Version|2026-02-10| {{Version/Mobile|5.1}}}}&lt;br /&gt;
{{Item/Version|2026-02-02| {{Version/Server|5.0.0}}}}&lt;br /&gt;
{{Item/Version|2025-09-29| {{Version/WinX|5.0}}}}&lt;br /&gt;
{{Item/Version|2025-09-27| {{Version/Mobile|5.0}}}}&lt;br /&gt;
{{Item/Version|2025-03-14| {{Version/Server|4.9.0}}}}&lt;br /&gt;
{{Item/Version|2025-02-05| {{Version/WinX|4.9}}}}&lt;br /&gt;
{{Item/Version|2025-02-05| {{Version/Xamarin|4.9}}}}&lt;br /&gt;
{{Item/Version|2024-09-14| {{Version/Server|4.8.1}}}}&lt;br /&gt;
{{Item/Version|2024-09-11| {{Version/WinX|4.8}}}}&lt;br /&gt;
{{Item/Version|2024-09-11| {{Version/Xamarin|4.8}}}}&lt;br /&gt;
{{Item/Version|2024-05-16| {{Version/Xamarin|4.7}}}}&lt;br /&gt;
{{Item/Version|2024-05-16| {{Version/WinX|4.7}}}}&lt;br /&gt;
{{Item/Version|2024-05-07| {{Version/Server|4.7.0}}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Item/Version|2024-02-05| {{Version/Server|4.6.0}}}}&lt;br /&gt;
{{Item/Version|2024-02-15| {{Version/WinX|4.6}}}}&lt;br /&gt;
{{Item/Version|2024-02-05| {{Version/Xamarin|4.6}}}}&lt;br /&gt;
{{Item/Version|2023-11-06| {{Version/Server|4.5.0}}}}&lt;br /&gt;
{{Item/Version|2023-11-02| {{Version/Xamarin|4.5}}}}&lt;br /&gt;
{{Item/Version|2023-11-02| {{Version/WinX|4.5}}}}&lt;br /&gt;
{{Item/Version|2023-09-12| {{Version/Server|4.4.0}}}}&lt;br /&gt;
{{Item/Version|2023-09-04| {{Version/Xamarin|4.4}}}}&lt;br /&gt;
{{Item/Version|2023-09-04| {{Version/WinX|4.4}}}}&lt;br /&gt;
{{Item/Version|2022-04-11| [[Version_4.3.0_(Server)|Version 4.3.0 - Server]]}}&lt;br /&gt;
{{Item/Version|2023-04-04| {{Version/Xamarin|4.3}}}}&lt;br /&gt;
{{Item/Version|2023-04-04| {{Version/WinX|4.3}}}}&lt;br /&gt;
{{Item/Version|2023-01.31| [[Version_3.7.1|Version 3.7.1 - Server]]}}&lt;br /&gt;
{{Item/Version|2023-01-30| {{Version/Xamarin|4.2}}}}&lt;br /&gt;
{{Item/Version|2023-01-30| {{Version/WinX|4.2}}}}&lt;br /&gt;
{{Item/Version|2022-11-17| {{Version/Server|4.0}}}}&lt;br /&gt;
{{Item/Version|2022-08-22| {{Version/Xamarin|4.1}}}}&lt;br /&gt;
{{Item/Version|2022-08-09| [[Version_3.7.0_Server|Version 3.7.0 - Server]]}}&lt;br /&gt;
{{Item/Version|2022-07-22| {{Version/WinX|4.1}}}}&lt;br /&gt;
{{Item/Version|2022-05-31| [[Version_3.6.2_Server|Version 3.6.2 - Server]]}}&lt;br /&gt;
{{Item/Version|2022-04-26| {{Version/WinX|4.0}}}}&lt;br /&gt;
{{Item/Version|2022-03-23| [[Version_3.6.1_Server|Version 3.6.1 - Server]]}}&lt;br /&gt;
{{Item/Version|2022-01-19| {{Version/Server|3.6}}}}&lt;br /&gt;
{{Item/Version|2021-12-22| {{Version/Xamarin|1.3}}}}&lt;br /&gt;
{{Item/Version|2021-05-31| {{Version/Xamarin|1.2}}}}&lt;br /&gt;
{{Item/Version|2021-04-23| {{Version/WinX|3.8}}}}&lt;br /&gt;
{{Item/Version|2020-11-12| {{Version/Xamarin|1.1}}}}&lt;br /&gt;
{{Item/Version|2020-04-09| {{Version/Server|3.5}}}}&lt;br /&gt;
{{Item/Version|2020-03-27| {{Version/WinX|3.7}}}}&lt;br /&gt;
{{Item/Version|2020-02-13| {{Version/WinX|3.6}}}}&lt;br /&gt;
{{Item/Version|2019-11-04| [[Version_1.0_(Xamarin.iOS)|Version 1.0&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; - Xamarin.iOS]]}}&lt;br /&gt;
{{Item/Version|2019-10-21| [[Version_1.0_(Xamarin.Android)|Version 1.0&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; - Xamarin.Android]]}}&lt;br /&gt;
{{Item/Version|2019-04-30| {{Version/WinX|3.5}}}}&lt;br /&gt;
{{Item/Version|2018-12-10| {{Version/Server|2.6}}}}&lt;br /&gt;
{{Item/Version|2018-12-10| {{Version/WinX|3.4}}}}&lt;br /&gt;
{{Item/Version|2018-10-24| {{Version/WinX|3.3}}}}&lt;br /&gt;
{{Item/Version|2018-07-06| {{Version/WinX|3.2.0}}}}&lt;br /&gt;
{{Item/Version|2018-04-19| {{Version/Android|3.0.0}}}}&lt;br /&gt;
{{Item/Version|2018-04-04| {{Version/Server|2.6}}}}&lt;br /&gt;
{{Item/Version|2018-03-08| {{Version/Android|2.6.0}}}}&lt;br /&gt;
{{Item/Version|2018-01-23| {{Version/WinX|3.1.0}}}}&lt;br /&gt;
{{Item/Version|2017-10-13| {{Version/WinX|3.0.0}}}}&lt;br /&gt;
{{Item/Version|2017-06-14| {{Version/Server|2.6}}}}&lt;br /&gt;
{{Item/Version|2017-02-13| {{Version/WinX|2.6.0}}}}&lt;br /&gt;
{{Item/Version|2016-07-21| {{Version/Android|2.5.5}}}}&lt;br /&gt;
{{Item/Version|2016-07-21| {{Version/Android|2.5.4}}}}&lt;br /&gt;
{{Item/Version|2016-04-01| {{Version/Android|2.5.3}}}}&lt;br /&gt;
{{Item/Version|2016-05-13| {{Version/WinX|2.5.2}}}}&lt;br /&gt;
{{Item/Version|2016-01-27| {{Version/Android|2.5.2}}}}&lt;br /&gt;
{{Item/Version|2015-11-25| {{Version/Web|2.5.0}}}}&lt;br /&gt;
{{Item/Version|2015-11-20| {{Version/Android|2.5.1}}}}&lt;br /&gt;
{{Item/Version|2015-11-17| {{Version/Android|2.5.0}}}}&lt;br /&gt;
{{Item/Version|2015-10-15| {{Version/Server|2.5}}}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[File:IC_MainPage-20.png]] '''Available Release Candidates'''&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;table&amp;quot; style=&amp;quot;width:100%;&amp;quot;&amp;gt;&lt;br /&gt;
{{Item/Version|2020-01-01| {{Version/Android|3.1.0}}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
[[File:IC_MainPage-21.png]] '''[[:Category:Release notes|Previous versions]]'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Release notes|List of Versions]]&lt;br /&gt;
[[Category:Version|List of Versions]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30365</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30365"/>
				<updated>2026-07-30T08:53:44Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Category:Version_5.3&amp;diff=30364</id>
		<title>Category:Version 5.3</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Category:Version_5.3&amp;diff=30364"/>
				<updated>2026-07-30T08:53:23Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Version]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30363</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30363"/>
				<updated>2026-07-30T08:50:16Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.3 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.3 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30362</id>
		<title>Version 5.3 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(Mobile)&amp;diff=30362"/>
				<updated>2026-07-30T08:49:46Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: Created page with &amp;quot;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to HowTo:Convert_Xamarin_XAMLs_to_Maui for migrating them to the new client...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30361</id>
		<title>Version 5.3 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30361"/>
				<updated>2026-07-30T08:43:44Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 5.3|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:Client|Version 5.3 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.3 (WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Category:Version_5.3&amp;diff=30360</id>
		<title>Category:Version 5.3</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Category:Version_5.3&amp;diff=30360"/>
				<updated>2026-07-30T08:42:15Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30359</id>
		<title>Version 5.3 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.3_(WinX)&amp;diff=30359"/>
				<updated>2026-07-30T08:38:53Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: Created page with &amp;quot;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}  == Availabi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.3.? on 202?-??-?? ===&lt;br /&gt;
* Fixed an issue where documents did not load properly when switching the sync mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.2_(Mobile)&amp;diff=30332</id>
		<title>Version 5.2 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.2_(Mobile)&amp;diff=30332"/>
				<updated>2026-07-23T08:06:36Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.x. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.2.? on 2026-07-?? ===&lt;br /&gt;
* Fixed an issue where documents did not reload properly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.2.2 on 2026-07-21 {{key press|Android: Store Beta}}{{key press|iOS: Store Beta}} ===&lt;br /&gt;
* Added support for [[Login_View#Offline_SSO_Login|Offline SSO Login]], allowing users to securely access the UBIK Client in offline mode after a successful online SSO authentication.&lt;br /&gt;
* UBIK LABs (Experimental) The update interval for live value updates (LiveValueUpdateIntervalMs) can be configured in profiles.&lt;br /&gt;
* Updated all client localization translations.&lt;br /&gt;
* Updated misleading text resources on dialogues to delete an object on the server and to locally discard an object.&lt;br /&gt;
* Fixed an issue where DocumentViewModel.ShowDocumentCommand did not work when combined with InvokeCommandAction.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.2|Version 5.2 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.2 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.2|Version 5.2 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=30050</id>
		<title>Version 5.1 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=30050"/>
				<updated>2026-07-07T08:36:45Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.1. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.1.?? on 2026-07-?? ===&lt;br /&gt;
* Updated misleading text resources on dialogues to delete an object on the server and to locally discard an object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.54 on 2026-07-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* You can now specify a boolean command parameter for ContentViewModel.DiscardContentCommand in order to skip the confirmation dialog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.52 2026-06-23 {{key press|Android: Store Beta}} / 5.1.53 2026-06-24 {{key press|iOS: Store Beta}} ===&lt;br /&gt;
* New features and enhancements in MRO.&lt;br /&gt;
** {{UBIK}} now supports defining [[MRO_Objects_(Client)#Procedure_Tasks|branching logic in procedure work packages]].&lt;br /&gt;
** {{UBIK}} now supports [[MRO_Objects_(Client)#Procedure_Tasks|calculation tasks which evaluate predefined expressions]].&lt;br /&gt;
** {{UBIK}} now supports [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Tasks]] configured with an [[Active_List_Client|Active List]].&lt;br /&gt;
** Added  [[MRO_Objects_(Client)#Numeric_Task|Numeric Tasks]] to record numeric values that are checked against an acceptable value range.&lt;br /&gt;
** Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
** [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* UBIK now supports [[Traits]] which are more flexible when it comes to server side configuration and maintenance.&lt;br /&gt;
* The system flashlight can now also be enabled or disabled via XAML customization. For detailed information, see [[Mobile XAML#Flashlight|Flashlight]]&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* Fixed an issue where changes in property editing were not discarded when using the default Back button.&lt;br /&gt;
* Fixed an issue where the application crashed on Windows when navigating back from the VideoPlayer.&lt;br /&gt;
* Icon set Addition 8: Added Show/Hide, AI, Info, and various Procedure icons.&lt;br /&gt;
* Fixed an issue where the [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#LoadNextLevelCommand|LoadNextLevelCommand]] did not work under specific conditions (invoked in offline and then in online mode).&lt;br /&gt;
* Fixed an issue where [[SYSCLS_CHILDINFOOWNER|child count]] indicators did not update when you delete its child objects which only exist locally.&lt;br /&gt;
* Fixed an issue where MRO task items displayed an incorrect DataTemplate after scrolling within a list.&lt;br /&gt;
* Fixed an issue where the client could fail at large file uploads (or even crash) due to device running out of memory.&lt;br /&gt;
* Fixed an issue where line breaks (in strings property values) from Windows are not recognized as such on other systems. The standard UI is not yet redesigned to show multi-line texts, though. But you can do so in customizing if necessary.&lt;br /&gt;
* Fixed the UI of some templates that weren't displayed correctly in Multi Select Mode.&lt;br /&gt;
* Fixed an issue where the status color was reflected as background color of an POI item.&lt;br /&gt;
* Fixed an issue where it was not possible to do a alternative import of a .profile file on iOS &amp;amp; Android.&lt;br /&gt;
* Fixed an issue where it was possible some list items were not updated correctly when e.g. you scroll through the list&lt;br /&gt;
* Fixed an issue where setting the SelectedIndex of a UBIKTabView leads to a crash.&lt;br /&gt;
* Fixed an issue where [[XAML_Tips#InvokeOnItemsCommand|BulkOperation.InvokeOnItemsCommand]] was not always applied to all items in the collection.&lt;br /&gt;
* Fixed an issue where the app sometimes redirects to the login page on certain Android devices. For example, when the device rotates or a physical keyboard is attached.&lt;br /&gt;
* Fixed an issue where the task value editing field is unlimited in space and covers everything else.&lt;br /&gt;
* Fixed an issue where filtering was not possible in query popups.&lt;br /&gt;
* Fixed an issue where it was not possible to set N/A via editors.&lt;br /&gt;
* Fixed an issue where the Properties UI was not refreshed properly after reverting changes.&lt;br /&gt;
* Fixed an issue where the app gets stuck during login when there are geography properties without values.&lt;br /&gt;
* Fixed an issue where the root object list doesn't get fully refreshed upon meta definition updates.&lt;br /&gt;
* Fixed a potential UI performance issue during file upload.&lt;br /&gt;
* Fixed an issue where it's impossible to show document files externally from list items.&lt;br /&gt;
* (iOS) Fixed an issue where the NFC button in the side menu looked like a toggle button while it's not.&lt;br /&gt;
* Fixed an issue where the Unit of a Task value has been clipped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.30 2026-03-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.29 on 2026-02-26 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where the POI button was only visible under certain condition (ShowUnreleasedFeatures in the profile is set to true).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.28 on 2026-02-10 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* The following features which existed in pre 5.0 versions are now available again in 5.1.&lt;br /&gt;
** [[Map_View|Map view]].&lt;br /&gt;
** [[POI_View_(Mobile)|POI view]]. (Aruco and OCR are not yet supported)&lt;br /&gt;
** Location service.&lt;br /&gt;
** [[Native_Push_(Client)|Native push]].&lt;br /&gt;
** [[Charts]].&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Complete UI overhaul introduces a cleaner, more modern and adaptive user interface with various quality of life improvements.&lt;br /&gt;
* UBIKTabView supports both dynamic and static items in combination with lazy loading.&lt;br /&gt;
* Files in the app's data folder can now be opened or deleted directly in the developer settings.&lt;br /&gt;
* Introduced a fully resource-driven UI theming system enabling fast, safe customization (dark mode, resizing, and consistent styling) by adapting a small set of centralized resources.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* Fixed an issue where remembered scroll positions were lost when the ItemsSource property of an SfListViewExt changed (e.g., Properties.ShowAllProperties).&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed issue that caused app to be stuck on splash screen after resuming from background.&lt;br /&gt;
* Fixed an issue where StatusColor was not shown in the UI for objects that didn't additionally have a Progress.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Fixed an issue that caused content of the custom ContentControl to not be rendered sometimes.&lt;br /&gt;
* (Android) Fixed an issue in the WebView where some links could not be opened.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
* Due to the change of the underlying XAML technology, the existing XAMLs for the old mobile clients (pre 5.0) are no longer compatible. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.&lt;br /&gt;
* There are some XAML changes necessary when using the new [[Active_List_Client|Active List]] feature, or when using the new [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Task]]. These XAML changes are explained [[Active_List_Client#XAML|here]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.1_(WinX)&amp;diff=30049</id>
		<title>Version 5.1 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.1_(WinX)&amp;diff=30049"/>
				<updated>2026-07-07T08:35:28Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.1.?? on 2026-07-?? ===&lt;br /&gt;
* Updated misleading text resources on dialogues to delete an object on the server and to locally discard an object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.17 on 2026-07-02 {{key press|Store}} ===&lt;br /&gt;
* Fixed an issue where ContentViewModel.Values did not display the values in the [[Developer Mode|developer mode]].&lt;br /&gt;
* You can now specify a boolean command parameter for ContentViewModel.DiscardContentCommand in order to skip the confirmation dialog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.16 on 2026-06-23 {{key press|Store Beta}} ===&lt;br /&gt;
* New features and enhancements in MRO.&lt;br /&gt;
** {{UBIK}} now supports defining [[MRO_Objects_(Client)#Procedure_Tasks|branching logic in procedure work packages]].&lt;br /&gt;
** {{UBIK}} now supports [[MRO_Objects_(Client)#Procedure_Tasks|calculation tasks which evaluate predefined expressions]].&lt;br /&gt;
** {{UBIK}} now supports [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Tasks]] configured with an [[Active_List_Client|Active List]].&lt;br /&gt;
** Added  [[MRO_Objects_(Client)#Numeric_Task|Numeric Tasks]] to record numeric values that are checked against an acceptable value range.&lt;br /&gt;
** Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
** [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* UBIK now supports [[Traits]] which are more flexible when it comes to server side configuration and maintenance.&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* Provided a visual difference between suggested and actual values in DateTime and Geo property direct edit fields via a [[XAML#Custom_VisualState_Trigger|Custom VisualState Trigger]].&lt;br /&gt;
* Fixed an issue where the [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#LoadNextLevelCommand|LoadNextLevelCommand]] did not work under specific conditions (invoked in offline and then in online mode).&lt;br /&gt;
* Fixed an issue where [[SYSCLS_CHILDINFOOWNER|child count]] indicators did not update when you delete its child objects which only exist locally.&lt;br /&gt;
* Fixed an issue where line breaks (in strings property values) from Windows are not recognized as such on other systems.&lt;br /&gt;
* Fixed an issue that caused dialogs to remain open when refreshing, causing problems.&lt;br /&gt;
* Fixed an issue where the app gets stuck during login when there are geography properties without values.&lt;br /&gt;
* Fixed an issue where the root object list doesn't get fully refreshed upon meta definition updates.&lt;br /&gt;
* Fixed a potential UI performance issue during file upload.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.9 on 2026-04-22 {{key press|Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.6 on 2026-02-10 {{key press|Store}} ===&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where certain documents couldn't be loaded anymore.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed an issue where the UI did not update properly when committing a direct edit input task.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Added a [[XAML#UBIKWebView|UBIKWebView]] control that includes a fix in the WebView2 where some links could not be opened.&lt;br /&gt;
* Fixed issue that caused input fields to be focused but not editable.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (WinX)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Free Text Annotations that where created in former sessions cannot be selected and therefore cannot be edited any more.&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* Known issues regarding the [[Documents_(Client)#Remember_Document_Settings|Remember Document Settings]] feature:&lt;br /&gt;
** Saving the Zoom value via touch gestures is not supported.&lt;br /&gt;
** Due to a third-party framework issue it can't be guaranteed that saving the Zoom level is always working properly. We reported this issue and will update our solution as soon as it is resolved on their side.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
* There are some XAML changes necessary when using the new [[Active_List_Client|Active List]] feature, or when using the new [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Task]]. These XAML changes are explained [[Active_List_Client#XAML|here]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29982</id>
		<title>Version 5.1 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29982"/>
				<updated>2026-06-18T12:59:00Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.1. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
=== 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* New features and enhancements in MRO.&lt;br /&gt;
** {{UBIK}} now supports defining [[MRO_Objects_(Client)#Procedure_Tasks|branching logic in procedure work packages]].&lt;br /&gt;
** {{UBIK}} now supports [[MRO_Objects_(Client)#Procedure_Tasks|calculation tasks which evaluate predefined expressions]].&lt;br /&gt;
** {{UBIK}} now supports [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Tasks]] configured with an [[Active_List_Client|Active List]].&lt;br /&gt;
** Added  [[MRO_Objects_(Client)#Numeric_Task|Numeric Tasks]] to record numeric values that are checked against an acceptable value range.&lt;br /&gt;
** Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
** [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* UBIK now supports [[Traits]] which are more flexible when it comes to server side configuration and maintenance.&lt;br /&gt;
* The system flashlight can now also be enabled or disabled via XAML customization. For detailed information, see [[Mobile XAML#Flashlight|Flashlight]]&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* Fixed an issue where changes in property editing were not discarded when using the default Back button.&lt;br /&gt;
* Fixed an issue where the application crashed on Windows when navigating back from the VideoPlayer.&lt;br /&gt;
* Icon set Addition 8: Added Show/Hide, AI, Info, and various Procedure icons.&lt;br /&gt;
* Fixed an issue where the [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#LoadNextLevelCommand|LoadNextLevelCommand]] did not work under specific conditions (invoked in offline and then in online mode).&lt;br /&gt;
* Fixed an issue where [[SYSCLS_CHILDINFOOWNER|child count]] indicators did not update when you delete its child objects which only exist locally.&lt;br /&gt;
* Fixed an issue where MRO task items displayed an incorrect DataTemplate after scrolling within a list.&lt;br /&gt;
* Fixed an issue where the client could fail at large file uploads (or even crash) due to device running out of memory.&lt;br /&gt;
* Fixed an issue where line breaks (in strings property values) from Windows are not recognized as such on other systems. The standard UI is not yet redesigned to show multi-line texts, though. But you can do so in customizing if necessary.&lt;br /&gt;
* Fixed the UI of some templates that weren't displayed correctly in Multi Select Mode.&lt;br /&gt;
* Fixed an issue where the status color was reflected as background color of an POI item.&lt;br /&gt;
* Fixed an issue where it was not possible to do a alternative import of a .profile file on iOS &amp;amp; Android.&lt;br /&gt;
* Fixed an issue where it was possible some list items were not updated correctly when e.g. you scroll through the list&lt;br /&gt;
* Fixed an issue where setting the SelectedIndex of a UBIKTabView leads to a crash.&lt;br /&gt;
* Fixed an issue where [[XAML_Tips#InvokeOnItemsCommand|BulkOperation.InvokeOnItemsCommand]] was not always applied to all items in the collection.&lt;br /&gt;
* Fixed an issue where the app sometimes redirects to the login page on certain Android devices. For example, when the device rotates or a physical keyboard is attached.&lt;br /&gt;
* Fixed an issue where the task value editing field is unlimited in space and covers everything else.&lt;br /&gt;
* Fixed an issue where filtering was not possible in query popups.&lt;br /&gt;
* Fixed an issue where it was not possible to set N/A via editors.&lt;br /&gt;
* Fixed an issue where the Properties UI was not refreshed properly after reverting changes.&lt;br /&gt;
* Fixed an issue where the app gets stuck during login when there are geography properties without values.&lt;br /&gt;
* Fixed an issue where the root object list doesn't get fully refreshed upon meta definition updates.&lt;br /&gt;
* Fixed a potential UI performance issue during file upload.&lt;br /&gt;
* Fixed an issue where it's impossible to show document files externally from list items.&lt;br /&gt;
* (iOS) Fixed an issue where the NFC button in the side menu looked like a toggle button while it's not.&lt;br /&gt;
* Fixed an issue where the Unit of a Task value has been clipped.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== 5.1.30 2026-03-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.29 on 2026-02-26 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where the POI button was only visible under certain condition (ShowUnreleasedFeatures in the profile is set to true).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.28 on 2026-02-10 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* The following features which existed in pre 5.0 versions are now available again in 5.1.&lt;br /&gt;
** [[Map_View|Map view]].&lt;br /&gt;
** [[POI_View_(Mobile)|POI view]]. (Aruco and OCR are not yet supported)&lt;br /&gt;
** Location service.&lt;br /&gt;
** [[Native_Push_(Client)|Native push]].&lt;br /&gt;
** [[Charts]].&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Complete UI overhaul introduces a cleaner, more modern and adaptive user interface with various quality of life improvements.&lt;br /&gt;
* UBIKTabView supports both dynamic and static items in combination with lazy loading.&lt;br /&gt;
* Files in the app's data folder can now be opened or deleted directly in the developer settings.&lt;br /&gt;
* Introduced a fully resource-driven UI theming system enabling fast, safe customization (dark mode, resizing, and consistent styling) by adapting a small set of centralized resources.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* Fixed an issue where remembered scroll positions were lost when the ItemsSource property of an SfListViewExt changed (e.g., Properties.ShowAllProperties).&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed issue that caused app to be stuck on splash screen after resuming from background.&lt;br /&gt;
* Fixed an issue where StatusColor was not shown in the UI for objects that didn't additionally have a Progress.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Fixed an issue that caused content of the custom ContentControl to not be rendered sometimes.&lt;br /&gt;
* (Android) Fixed an issue in the WebView where some links could not be opened.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
* Due to the change of the underlying XAML technology, the existing XAMLs for the old mobile clients (pre 5.0) are no longer compatible. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.&lt;br /&gt;
* There are some XAML changes necessary when using the new [[Active_List_Client|Active List]] feature, or when using the new [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Task]]. These XAML changes are explained [[Active_List_Client#XAML|here]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29885</id>
		<title>Version 5.1 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29885"/>
				<updated>2026-05-20T10:02:02Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.1. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
=== 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* UBIK Client now supports [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Tasks]] configured with an [[Active_List_Client|Active List]].&lt;br /&gt;
* Added  [[MRO_Objects_(Client)#Numeric_Task|Numeric Tasks]] to record numeric values that are checked against an acceptable value range.&lt;br /&gt;
* UBIK now supports [[Traits]] which are more flexible when it comes to server side configuration and maintenance.&lt;br /&gt;
* Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
* The system flashlight can now also be enabled or disabled via XAML customization. For detailed information, see [[Mobile XAML#Flashlight|Flashlight]]&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* Fixed an issue where changes in property editing were not discarded when using the default Back button.&lt;br /&gt;
* Fixed an issue where the application crashed on Windows when navigating back from the VideoPlayer.&lt;br /&gt;
* Icon set Addition 8: Added Show/Hide, AI, Info, and various Procedure icons.&lt;br /&gt;
* Fixed an issue where the [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#LoadNextLevelCommand|LoadNextLevelCommand]] did not work under specific conditions (invoked in offline and then in online mode).&lt;br /&gt;
* Fixed an issue where [[SYSCLS_CHILDINFOOWNER|child count]] indicators did not update when you delete its child objects which only exist locally.&lt;br /&gt;
* Fixed an issue where MRO task items displayed an incorrect DataTemplate after scrolling within a list.&lt;br /&gt;
* Fixed an issue where the client could fail at large file uploads (or even crash) due to device running out of memory.&lt;br /&gt;
* Fixed an issue where line breaks (in strings property values) from Windows are not recognized as such on other systems. The standard UI is not yet redesigned to show multi-line texts, though. But you can do so in customizing if necessary.&lt;br /&gt;
* Fixed the UI of some templates that weren't displayed correctly in Multi Select Mode.&lt;br /&gt;
* Fixed an issue where the status color was reflected as background color of an POI item.&lt;br /&gt;
* Fixed an issue where it was not possible to do a alternative import of a .profile file on iOS &amp;amp; Android.&lt;br /&gt;
* Fixed an issue where it was possible some list items were not updated correctly when e.g. you scroll through the list&lt;br /&gt;
* Fixed an issue where setting the SelectedIndex of a UBIKTabView leads to a crash.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== 5.1.30 2026-03-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.29 on 2026-02-26 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where the POI button was only visible under certain condition (ShowUnreleasedFeatures in the profile is set to true).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.28 on 2026-02-10 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* The following features which existed in pre 5.0 versions are now available again in 5.1.&lt;br /&gt;
** [[Map_View|Map view]].&lt;br /&gt;
** [[POI_View_(Mobile)|POI view]]. (Aruco and OCR are not yet supported)&lt;br /&gt;
** Location service.&lt;br /&gt;
** [[Native_Push_(Client)|Native push]].&lt;br /&gt;
** [[Charts]].&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Complete UI overhaul introduces a cleaner, more modern and adaptive user interface with various quality of life improvements.&lt;br /&gt;
* UBIKTabView supports both dynamic and static items in combination with lazy loading.&lt;br /&gt;
* Files in the app's data folder can now be opened or deleted directly in the developer settings.&lt;br /&gt;
* Introduced a fully resource-driven UI theming system enabling fast, safe customization (dark mode, resizing, and consistent styling) by adapting a small set of centralized resources.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* Fixed an issue where remembered scroll positions were lost when the ItemsSource property of an SfListViewExt changed (e.g., Properties.ShowAllProperties).&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed issue that caused app to be stuck on splash screen after resuming from background.&lt;br /&gt;
* Fixed an issue where StatusColor was not shown in the UI for objects that didn't additionally have a Progress.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Fixed an issue that caused content of the custom ContentControl to not be rendered sometimes.&lt;br /&gt;
* (Android) Fixed an issue in the WebView where some links could not be opened.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
* Due to the change of the underlying XAML technology, the existing XAMLs for the old mobile clients (pre 5.0) are no longer compatible. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.&lt;br /&gt;
* There are some XAML changes necessary when using the new [[Active_List_Client|Active List]] feature, or when using the new [[MRO_Objects_%28Client%29#Pick_List_Task|MRO Pick List Task]]. These XAML changes are explained [[Active_List_Client#XAML|here]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=29878</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=29878"/>
				<updated>2026-05-11T11:08:24Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: /* Organisational Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Android)|MRO UI (Android)]]&lt;br /&gt;
The WinX client UI displays MRO configured objects like any other root- or child-object enriched by some additional logic and features.&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
The representation of MRO features comprises some indicators and interactive controls. In the {{UBIK}} child list, the main object displays cumulated technical and organisational status as well as the overall work progress based on the underlying data branch. Objects classified as MRO objects in general provide indicators for the MRO status. This means the status is shown next to the main icon of a child-/details-/documents-page as well as next to the icons of the child list items:&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on all objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. If e.g. a inventory object is reported as damaged, its parent objects will all display the exclamation mark symbol to indicate that a problem was reported in the child items.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (Winx &amp;amp; Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
The organisational status indicates the amount of confirmed work within the data branch, including already confirmed work packages as well as tasks that are locked by their owning work package. The organisational status indicator is displayed on all objects that represent an organisational state or receive the organisational status from subsequent objects in the underlying data branch, and visualizes the amount of confirmed work performed within that branch.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|MRO Workpackage Confirmed (Flag) Indicator (WinX)&lt;br /&gt;
File:Android_orga_status.PNG|Organisational Status Indicator (Android)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|MRO Workpackage Confirmed Indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
The work progress is calculated from the current work progress and from the progress cumulated from subsequent objects in the underlying data branch. This indicator shows the amount of work done in the data branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, the progress is displayed with maximum one decimal place. For example, 99.75% is displayed as 99.8%. The format string used to achieve this is &amp;lt;code&amp;gt;{0:0.#}%&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If other numeric formats are preferred in your usecases, you can refer to [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings] for more information. The template to customize for this is the UBIKMROProgressBadge within UBIKThemes.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
A set of specific objects can be used to provide the required structure for MRO:&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object having a substructure of jobs to be done. It can have a tree of other task owners or work packages underneath that will update the status of the task owner. This status consists of technical, organisational and progress information. With a task owner a user can get an overview of all the work to be done in the underlying job structure.&lt;br /&gt;
&lt;br /&gt;
=== Work Package===&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] is a collection of objects to collect and summarize other task owning objects, workpackages, or tasks. A simple workpackage has a certain amount of tasks that have to be finished in order to confirm the workpackage as done. More complex workpackages can also own other underlying workpackages that have to be confirmed.  Confirming a workpackage itself requires a progress of 100% of all related tasks, as well as 100% confirmed sub work packages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|MRO Workpackage confirm button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|MRO Workpackage revoke confirmation button (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|MRO Workpackage confirm button (Android)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|MRO Workpackage revoke confirmation button (Android)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] is an object reporting a certain progress to the owning workpackage. There are several specialized types of task objects. All kinds of tasks have a property called '''VALUE''' in common. It is very important, that this property is able to be validated. Therefore, a MetaAttribute (providing a validation timestamp by default) has to be attached on the used MetaProperty.&lt;br /&gt;
&lt;br /&gt;
On both clients, a Task can be reverted by clicking twice on the Not Applicable button.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|The MetaProperty ''VALUE'' has to use [[Attributes]] in order to be validated. Otherwise, the calculation of work progress will not be possible.}}&lt;br /&gt;
&lt;br /&gt;
==== Measurement Task ====&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_MEASUREMENT_TASK|Measurement Task]] inherits from [[MROCLS_MRO_TASK|Task]] and documents a measured value (e.g. read from a pressure gauge). Therefore, clicking the value on the shown task opens an editor to enter the desired value. If no value was entered before, an empty line will be shown. Once a value has been entered, the task is finished. Alternatively, the task can also be closed by the option ''Not Applicable'' to document the situation of not being able to fullfill the measurement (e.g. the pressure gauge is broken). An additional small value indicator below the main value can report e.g. the previously entered value. The behaviour of this previous value indicator has to be specified separately in the customizing.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a reported value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a reported value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a reported value (Android)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Progress Task ====&lt;br /&gt;
&lt;br /&gt;
[[MROCLS_MRO_PROGRESS_TASK| Progress Task]] inherits from [[MROCLS_MRO_MEASUREMENT_TASK|Task]] and reports a certain progress while fullfilling a task. The progress will influence the overall progress of the owning workpackage. If the task cannot be fullfilled, it can also be finished with the option ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
There is also an [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] available for progress tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with a reported work progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with a reported work progress and a previous progress(Android)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Check Task ====&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_CHECK_TASK|Check Task]] inherits from [[MROCLS_MRO_TASK|Task]] and is finished by reporting ''Done'' or ''Not Applicable''. This is intended for a simple To-Do task that is either done or not.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Unfinished MRO CheckTask (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable MRO CheckTask (Android)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Inspection Task ====&lt;br /&gt;
&lt;br /&gt;
[[MROCLS_MRO_INSPECTION_TASK|Inspection Task]] inherits from [[MROCLS_MRO_TASK|Task]] and is finished, when the user reports with a positive or negative answer or ''Not Applicable'' (e.g. reporting a yes/no answer for existing equipment).&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished MRO InspectionTask (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished MRO InspectionTask (Android)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|sequential task classification]] allows you to pre-define a sequence in which tasks are to be resolved by users. This means that it is required for one or multiple tasks to be finished in order for other tasks to become &amp;quot;unlocked&amp;quot; and editable. A task can have any number of &amp;quot;predecessors&amp;quot;. Predecessors are the tasks that are required to be finished first.&lt;br /&gt;
&lt;br /&gt;
A task can have predecessors that live anywhere else in the object hierarchy. It is not necessary for a task and its predecessors to be part of the same work package, even though this is likely the most common use case.&lt;br /&gt;
&lt;br /&gt;
The state of a sequential task is evaluated both offline and online to get the best possible user experience. The user will see dependent tasks update immediately if their successors were finished, if those tasks are currently visible in the UI. There is 1 case in which the server-side state will override the client-side (offline) evaluation, discussed below.&lt;br /&gt;
The state of each sequential task is evaluated the following way:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says the task is open, we consider this as the truthful state and don't do any other evaluation.&lt;br /&gt;
# Check if the task has any predecessors.&lt;br /&gt;
# Try to load each predecessor task.&lt;br /&gt;
#* If loading of any predecessor fails (the object is not available offline), the task will be locked.&lt;br /&gt;
# If all predecessor tasks are finished, the task is open and can be edited. Otherwise, the task is locked.&lt;br /&gt;
&lt;br /&gt;
The customizer setting up the task dependency relations needs to ensure that the dependencies are not cyclical. In this case, it would be impossible for any tasks in the &amp;quot;cycle&amp;quot; to be finished.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
As a demonstration of this feature, see [[Media:Sequential_tasks_winx.mp4|this video]]. The relations between tasks are defined as in [[Media:Task_relations.png|this image]], starting at A1 and A2, which are not dependent on any other tasks. The lines (from left to right) indicate dependencies. This means that B2 has tasks A1 and A2 as its predecessors, for example.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
Sometimes, not all tasks have to be finished. More specifically, there might be a predefined condition where you only need to finish a certain number of tasks among a group of them. These are known in {{UBIK}} as [[MROCLS_GROUPEDTASK|grouped tasks]].&lt;br /&gt;
&lt;br /&gt;
The idea is, a group of tasks can be defined as siblings to each other and they also share the same server configured threshold. When the number of finished tasks among that group exceeds the threshold, the entire group is considered as no longer necessary. When reflected in the overall status of the task owner(s), these tasks would appear as if they are finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, the finished status is completely independent from the not necessary status on a task. A grouped task which is no longer necessary can be both finished or not yet finished. In other words, users don't have to finish a not necessary grouped task, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation for grouped tasks and their task owners requires the knowledge of all siblings tasks. Imagine 2 out of 3 tasks must be finished but the client only knows 1 in total and the others are only available at the server at that time. This makes it impossible to draw conclusions whether the task(s) should be necessary or not. Under such circumstances, the local status calculation is done as if these are just regular tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Like with the other MRO objects, the client always chooses the best available statuses for grouped tasks to present to the users. More specifically, it uses the statuses calculated by the server when the client is not offline and there are no uncommitted local changes on the involved objects. Otherwise, it uses the statuses calculated locally to the best of its knowledge.}}&lt;br /&gt;
&lt;br /&gt;
A task can also be a grouped and a sequential one at the same time. In such a case, the grouped nature of the sibling tasks will affect the way the task sequence completes.&lt;br /&gt;
&lt;br /&gt;
For example, task A1, A2 and A3 are 3 grouped sibling tasks and only 1 of them needs to be finished. At the same time, they are all predecessors of task B. Normally, all predecessors must be finished (and locked) before task B becomes the next one in the sequence and therefore unlocked. In this case, however, as soon as one of the predecessors is finished, all three become unnecessary (and locked) and task B unlocks as a result of that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Supervisor Task {{Version/XamarinSince|4.8}} ====&lt;br /&gt;
As the name suggests, supervisor tasks are those that must be finished under supervision. When users want to finish a [[MROCLS_MRO_SUPERVISOR_TASK|supervisor task]], they must hand over their work devices to a supervisor. The latter checks the work status and scans an NFC tag if the work is approved. If the [[MROCLS_MRO_SUPERVISOR|supervisor]] has sufficient permissions for the task and the correct supervisor PIN is given, the task gets unlocked and the users can proceed to finish it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Task Before Verification/Unlocking (Mobile)&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor Task Enter PIN (Mobile)&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Task After Verification/Unlocking (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A thing to note is that while the need to verify a supervisor task can be seen as a type of locking, it's certainly not the only reason for a [[Locked_Objects|locked object]]. This means a supervisor task can remain locked (although for different reasons) even after a supervisor has successfully verified it. This can often be the case if you use it in combination with other features such as [[MRO_Objects_(Client)#Sequential_Task|sequential tasks]], [[User_Rights|user rights]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For security reasons, the verification process is cancelled if the supervisor enters the wrong PIN for three times. Scanning the tag again is required in that case.}}&lt;br /&gt;
{{Hint|A setting controls [[RFID_tags#Choose_which_information_to_use_from_a_tag|which information in a scanned tag is used]] during this process.}}&lt;br /&gt;
&lt;br /&gt;
==== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
The Signature Task is a task type that is completed by capturing a handwritten signature from the user. The task contains an editor field that serves as the entry point for the signing process. When the user clicks (or taps) on the editor field, a signature dialog opens. Within this dialog, the user can provide their signature. After confirming the input, the signature is saved and the task is automatically marked as completed.&lt;br /&gt;
&lt;br /&gt;
If the task is signed while the client is online:&lt;br /&gt;
* The User (signee) is resolved immediately by the server and displayed.&lt;br /&gt;
* The ValidationTimestamp is generated and displayed.&lt;br /&gt;
* Both values are shown directly in the editor field after signing.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The User only gets resolved by the server and displayed once you're in online mode}}&lt;br /&gt;
&lt;br /&gt;
If the displayed User and/or ValidationTimestamp cannot be fully shown due to limited space in the editor field, the complete information can be accessed via a Popup.&lt;br /&gt;
To show the Popup displaying the full User and ValidationTimestamp without truncation, click on the editor field.&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;br /&gt;
&lt;br /&gt;
==== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICTURE_TASK|picture task]] is a check task which can only be finished when it has at least one child document containing a valid file. In the UI, an additional photo button is presented next to the check so users can easily take photos before finishing the tasks.&lt;br /&gt;
* As any other objects, picture tasks can carry and display [[SYSCLS_CHILDINFOOWNER|child count information]]. But that is not a mandatory part of the feature. Even when it's not configured and not visible in the UI, you can still finish the tasks.&lt;br /&gt;
* In WinX/UWP, the UI also presents an expander which allows you to display the child documents of picture tasks. This is not present by default in the Mobile app due to the screen size limit but [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|can be easily customized]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|The task is named as such because pictures are the most commonly used types, but the child documents can be of other types as well. }}&lt;br /&gt;
&lt;br /&gt;
When a user tries to finish a picture task by tapping the check, the app might perform some data synchronization first if in online mode, which includes&lt;br /&gt;
* Syncing the child objects (including documents) of the task.&lt;br /&gt;
* Downloading the file(s) of the child documents.&lt;br /&gt;
During data synchronization, the check button on that task turns into a wait indicator. Afterwards, the app checks if the prerequisites to finish the task are met.&lt;br /&gt;
* If there are no child documents or no local files for the child documents, the task remains unfinished and the user gets informed about the reasons.&lt;br /&gt;
* Otherwise, the task gets finished and the photo button gets disabled.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Setting NA (not applicable) on a picture task is always possible, regardless of the condition of child documents.}}&lt;br /&gt;
&lt;br /&gt;
==== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_NUMERIC_TASK|numeric task]] is a task which records a double value (e.g. from a temperature sensor). Entering the value (including Not Applicable) completes the task.&lt;br /&gt;
* The value is compared against an accaptable value range which is not editable on the client.&lt;br /&gt;
* Deviation from this range results in visual feedback as well as the [[#Tech Status|tech status]] being set to display an issue.&lt;br /&gt;
* If the configured value range is invalid (e.g. min &amp;gt; max) and the user enters a value, the [[#Tech Status|tech status]] will also be set to display an issue.&lt;br /&gt;
* A numeric task also has a special value unit that can be set per task instance. If set, it overrides the standard value unit defined on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
==== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICK_LIST_TASK|Pick List task]] looks and behaves the same like a standard Integer Task with SelectiveList. Other than the standard Integer Task, the Pick List Task has an [[UBIK_Active_Lists|Active List]] defined on instance level to pick from for its value property. The task counts as finished as soon as a list item has been selected, or when pressing ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MRO objects with project information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Info (WinX)]]&lt;br /&gt;
An MRO object (except tasks) might also bring along [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information together with the MRO progress are displayed in a bar chart. The start &amp;amp; end dates of the MRO object are displayed on the progress bar. The length and the position of the progress bar, together with the current date mark indicate the timeline.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
When an (MRO) object is locked, editing it becomes impossible. More details about [[Locked_Objects|locked objects]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
* [[MROCLS_PROCEDURE#Procedure Workpackage]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_TASK#Switch Task]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK#Switch End Task]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK#Calculation Task]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=File:OrgaStatusIndicatorWinX.PNG&amp;diff=29877</id>
		<title>File:OrgaStatusIndicatorWinX.PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=File:OrgaStatusIndicatorWinX.PNG&amp;diff=29877"/>
				<updated>2026-05-11T11:08:03Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=File:OrgStatusIndicator.png&amp;diff=29875</id>
		<title>File:OrgStatusIndicator.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=File:OrgStatusIndicator.png&amp;diff=29875"/>
				<updated>2026-05-11T11:06:08Z</updated>
		
		<summary type="html">&lt;p&gt;CWI: CWI uploaded a new version of File:OrgStatusIndicator.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>CWI</name></author>	</entry>

	</feed>