{"id":673,"date":"2023-01-10T12:47:23","date_gmt":"2023-01-10T12:47:23","guid":{"rendered":"https:\/\/learnmobiledevelopment.com\/?p=673"},"modified":"2023-01-18T16:06:34","modified_gmt":"2023-01-18T16:06:34","slug":"observableobject-in-maui-for-data-binding","status":"publish","type":"post","link":"https:\/\/learnmobiledevelopment.com\/index.php\/2023\/01\/10\/observableobject-in-maui-for-data-binding\/","title":{"rendered":"How to use ObservableObject in MAUI for Data Binding"},"content":{"rendered":"\n<p>The traditional way to implement MVVM (Model-View-ViewModel) using <strong>INotifyPropertyChanged<\/strong> interface but now we have a <strong>ObservableObject<\/strong> that provides a base implementation for <strong>INotifyPropertyChanged<\/strong> and <strong>INotifyPropertyChanging<\/strong> and this is exposing the <strong>PropertyChanged<\/strong> and <strong>PropertyChanging<\/strong> events. So In this article, I\u2019m going to show you How to use <strong>ObservableObject<\/strong> in MAUI for Data Binding.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>&nbsp;Note : <\/strong>To use <strong>ObservableObject<\/strong> we must mark the viewmodel class as <strong>partial<\/strong>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p style=\"font-size:25px\"><strong>Let\u2019s Start<\/strong><\/p>\n\n\n\n<p>In this article you will see :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>What is MVVM?<\/strong><\/li>\n\n\n\n<li><strong>Main features of <strong>ObservableObject<\/strong>?<\/strong><\/li>\n\n\n\n<li><strong>What is ObservableProperty<\/strong> <strong>attribute?<\/strong><\/li>\n\n\n\n<li><strong>What is RelayCommand attribute?<\/strong><\/li>\n\n\n\n<li><strong>How to invoke command when clicking on collectionview item?<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"has-medium-font-size\"><strong>1 &#8211; What is MVVM?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It stands for Model View ViewModel.<\/li>\n\n\n\n<li>It enables the separation between <strong>View<\/strong>, <strong>Model<\/strong> and <strong>ViewModel<\/strong>.\n<ul class=\"wp-block-list\">\n<li><strong><strong>View<\/strong><\/strong> &#8211; It indicates the user interface where a user can interact with. <strong>(eg : xaml)<\/strong><\/li>\n\n\n\n<li><strong>Model<\/strong> &#8211; the underlying data.<\/li>\n\n\n\n<li><strong>ViewModel<\/strong> &#8211; Intermediary between the <strong>View<\/strong> and the <strong>Model<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>View and ViewModel are connected using <strong>BindingContext<\/strong>.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"263\" src=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MVVM-1024x263.png\" alt=\"MVVM\" class=\"wp-image-670\" srcset=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MVVM-1024x263.png 1024w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MVVM-300x77.png 300w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MVVM-768x197.png 768w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MVVM-850x218.png 850w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MVVM.png 1418w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>2 &#8211; <strong>Main features of <strong>ObservableObject<\/strong>?<\/strong><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It provides the base implementation for <strong>INotifyPropertyChanged<\/strong> and <strong>INotifyPropertyChanging<\/strong>.<\/li>\n\n\n\n<li>It exposes the <strong>PropertyChanged<\/strong> and <strong>PropertyChanging<\/strong> events.<\/li>\n\n\n\n<li>It provides the series of <strong>SetProperty()<\/strong> methods that can be used for setting the property value.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>3 &#8211; What is ObservableProperty attribute?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It allows us to generate observable properties from annotated fields.<\/li>\n\n\n\n<li>It reduces boilerplate code. <\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Without ObservableProperty attribute<\/strong> <strong>:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private string _user;\npublic string User\n{\n    get => _user;\n    set\n      {\n           _user = value;\n           OnPropertyChanged();\n      }\n}<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>With ObservableProperty attribute :<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ObservableProperty]\nprivate string user;<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>4 &#8211; What is RelayCommand attribute?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It allows us to generate relay command property for annotated methods.<\/li>\n\n\n\n<li>It reduces boilerplate code. <\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Without <strong>RelayCommand<\/strong> attribute<\/strong> <strong>:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class MainPageViewModel : INotifyPropertyChanged\n{\n     public ICommand AddUserCommand { get; set; }\n     public ICommand DeleteUserCommand { get; set; }\n\n     public MainPageViewModel()\n     {\n         AddUserCommand = new Command(() =>\n         {\n         });\n\n         DeleteUserCommand = new Command&lt;string>((user) =>\n         {\n         });   \n     }\n}<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>With <strong>RelayCommand<\/strong> attribute<\/strong> <strong>:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public partial class MainPageViewModel : ObservableObject\n{\n    public MainPageViewModel()\n    {\n    }\n\n    [RelayCommand]\n    public void AddUser()\n    {\n    }\n\n    [RelayCommand]\n    public void DeleteUser(string user)\n    {\n    }\n}<\/pre>\n\n\n\n<p>I have created a sample demo project to understand better. So let\u2019s deep dive into this.<\/p>\n\n\n\n<p>In this sample demo i have used <strong><a href=\"https:\/\/www.nuget.org\/packages\/CommunityToolkit.Mvvm\/\" target=\"_blank\" rel=\"noopener\" title=\"\">CommunityToolkit.Mvvm<\/a><\/strong> nuget package.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"617\" src=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_-1024x617.png\" alt=\"CommunityToolkit.MVVM\" class=\"wp-image-695\" srcset=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_-1024x617.png 1024w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_-300x180.png 300w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_-768x463.png 768w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_-1536x925.png 1536w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_-850x512.png 850w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/CommunityToolkit.MVVM_.png 1750w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Create a MainPage.xaml<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?>\n&lt;ContentPage\n    x:Class=\"MAUIInvokeCommandOnListItemClickDemo.MainPage\"\n    xmlns=\"http:\/\/schemas.microsoft.com\/dotnet\/2021\/maui\"\n    xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2009\/xaml\"\n    x:Name=\"MainPageContainer\">\n\n    &lt;Grid\n        Padding=\"30,5\"\n        HorizontalOptions=\"Fill\"\n        RowDefinitions=\"*,Auto\"\n        RowSpacing=\"10\"\n        VerticalOptions=\"Fill\">\n\n        &lt;CollectionView\n            Grid.Row=\"0\"\n            Margin=\"0,30,0,0\"\n            ItemsSource=\"{Binding UserList}\"\n            SelectionMode=\"None\">\n\n            &lt;CollectionView.ItemTemplate>\n                &lt;DataTemplate>\n                    &lt;Frame Padding=\"3\" CornerRadius=\"0\">\n                        &lt;StackLayout\n                            Padding=\"10\"\n                            HorizontalOptions=\"FillAndExpand\"\n                            Orientation=\"Horizontal\"\n                            VerticalOptions=\"FillAndExpand\">\n                            &lt;Label\n                                x:Name=\"UserName\"\n                                HorizontalOptions=\"FillAndExpand\"\n                                Text=\"{Binding .}\"\n                                TextColor=\"Black\" \/>\n                            &lt;Frame\n                                Padding=\"7\"\n                                CornerRadius=\"15\"\n                                HeightRequest=\"30\"\n                                HorizontalOptions=\"EndAndExpand\"\n                                WidthRequest=\"30\">\n                                &lt;Image Source=\"delete_user.png\" \/>\n                                &lt;Frame.GestureRecognizers>\n                                    &lt;TapGestureRecognizer Command=\"{Binding BindingContext.DeleteUserCommand, Source={x:Reference MainPageContainer}}\" CommandParameter=\"{Binding .}\" \/>\n                                &lt;\/Frame.GestureRecognizers>\n                            &lt;\/Frame>\n                        &lt;\/StackLayout>\n                    &lt;\/Frame>\n                &lt;\/DataTemplate>\n            &lt;\/CollectionView.ItemTemplate>\n        &lt;\/CollectionView>\n\n        &lt;VerticalStackLayout Grid.Row=\"1\">\n\n            &lt;Entry Placeholder=\"Type name\" Text=\"{Binding User}\" \/>\n\n            &lt;Button\n                Margin=\"0,10,0,0\"\n                Command=\"{Binding AddUserCommand}\"\n                HorizontalOptions=\"CenterAndExpand\"\n                Text=\"Add User\" \/>\n\n        &lt;\/VerticalStackLayout>\n\n    &lt;\/Grid>\n\n&lt;\/ContentPage><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>As in the above <strong>MainPage.xaml<\/strong>, I have taken <strong>CollectionView<\/strong> to show list of user and <strong>Entry\/Button<\/strong> to add new user.<\/li>\n\n\n\n<li>As you will notice, I bound the properties in the same way as we used to do it before.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>MainPage.xaml.cs<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace MAUIInvokeCommandOnListItemClickDemo;\n\npublic partial class MainPage : ContentPage\n{\n    public MainPage()\n    {\n        InitializeComponent();\n        BindingContext = new MainPageViewModel();\n    }\n}<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Create a MainPageViewModel.cs<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing System.Collections.ObjectModel;\n\nnamespace MAUIInvokeCommandOnListItemClickDemo\n{\n    public partial class MainPageViewModel : ObservableObject\n    {\n        [ObservableProperty]\n        private ObservableCollection&lt;string> userList;\n\n        [ObservableProperty]\n        private string user;\n\n        public MainPageViewModel()\n        {\n            GetUserList();\n        }\n\n        [RelayCommand]\n        public void AddUser()\n        {\n            Application.Current.Dispatcher.Dispatch(() =>\n            {\n                if (!string.IsNullOrEmpty(User))\n                {\n                    UserList.Add(User);\n                    User = string.Empty;\n                }\n            });\n        }\n\n        [RelayCommand]\n        public void DeleteUser(string user)\n        {\n            Application.Current.Dispatcher.Dispatch(() =>\n            {\n                if (!string.IsNullOrEmpty(user))\n                {\n                    UserList.Remove(user);\n                }\n            });\n        }\n\n        private void GetUserList()\n        {\n            UserList = new ObservableCollection&lt;string>()\n            {\n                \"User 1\",\n                \"User 2\",\n                \"User 3\",\n                \"User 4\",\n                \"User 5\",\n            };\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>5 &#8211; How to invoke command when clicking on collectionview item?<\/strong><\/p>\n\n\n\n<p>As you will see in <strong>MainPage.xaml<\/strong>, I have added a collection view item click event and passed the parameter to view model.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;Frame.GestureRecognizers>\n  &lt;TapGestureRecognizer Command=\"{Binding BindingContext.DeleteUserCommand, Source={x:Reference MainPageContainer}}\" CommandParameter=\"{Binding .}\" \/>\n&lt;\/Frame.GestureRecognizers><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MainPageContainer<\/strong> indicates the root page.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Result<\/strong> <\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"2796\" style=\"aspect-ratio: 1290 \/ 2796;\" width=\"1290\" controls src=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/ObservableObject.mp4\"><\/video><\/figure>\n\n\n\n<p>That\u2019s all for now!<\/p>\n\n\n\n<p>You can check the full source code&nbsp;<strong><a href=\"https:\/\/github.com\/Alam-Ashraf\/MAUIInvokeCommandOnListItemClickDemo\" target=\"_blank\" rel=\"noopener\" title=\"\">here<\/a>.<\/strong><\/p>\n\n\n\n<p>Happy Coding! <strong>\ud83d\ude00&nbsp;<\/strong><\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-medium-font-size\"><strong>You may also like<\/strong><\/p>\n\n\n\n<div class=\"wp-block-group is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-0dfbf163 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-4b2eccd6 wp-block-group-is-layout-flex\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/learnmobiledevelopment.com\/index.php\/2023\/01\/04\/get-device-and-app-informations-in-maui\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/Device-And-App-Info-1024x684.png\" alt=\"get device and app informations in maui\" class=\"wp-image-653\" width=\"512\" height=\"342\" srcset=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/Device-And-App-Info-1024x684.png 1024w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/Device-And-App-Info-300x200.png 300w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/Device-And-App-Info-768x513.png 768w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/Device-And-App-Info-850x568.png 850w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/Device-And-App-Info.png 1296w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center\">How to get Device and App Informations in MAUI<\/p>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-4b2eccd6 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-4b2eccd6 wp-block-group-is-layout-flex\"><div class=\"wp-block-image is-style-default\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/learnmobiledevelopment.com\/index.php\/2023\/01\/02\/mediaelement-in-xamarin-forms\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MediaElementInXamarin-1024x737.png\" alt=\"MediaElement in Xamarin Forms\" class=\"wp-image-631\" width=\"512\" height=\"369\" srcset=\"https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MediaElementInXamarin-1024x737.png 1024w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MediaElementInXamarin-300x216.png 300w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MediaElementInXamarin-768x553.png 768w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MediaElementInXamarin-850x612.png 850w, https:\/\/learnmobiledevelopment.com\/wp-content\/uploads\/2023\/01\/MediaElementInXamarin.png 1256w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center\">How to use MediaElement in Xamarin Forms<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The traditional way to implement MVVM (Model-View-ViewModel) using INotifyPropertyChanged interface but now we have a ObservableObject that provides a base implementation for INotifyPropertyChanged and INotifyPropertyChanging and this is exposing the PropertyChanged and PropertyChanging events. So In this article, I\u2019m going to show you How to use ObservableObject in MAUI for Data Binding. &nbsp;Note : To&#8230;<\/p>\n","protected":false},"author":1,"featured_media":686,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[4,53],"tags":[54,55,56],"class_list":["post-673","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnetmaui","category-mvvm","tag-mvvm","tag-mvvm-in-maui","tag-observableobject"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/posts\/673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/comments?post=673"}],"version-history":[{"count":19,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/posts\/673\/revisions"}],"predecessor-version":[{"id":738,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/posts\/673\/revisions\/738"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/media\/686"}],"wp:attachment":[{"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/media?parent=673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/categories?post=673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learnmobiledevelopment.com\/index.php\/wp-json\/wp\/v2\/tags?post=673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}