{"id":37763,"date":"2024-11-01T10:00:14","date_gmt":"2024-11-01T10:00:14","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=37763"},"modified":"2024-11-01T11:03:50","modified_gmt":"2024-11-01T11:03:50","slug":"wpf-tutorial-designing-wpf-applications-using-mvvm","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/37763\/","title":{"rendered":"WPF Tutorial, Designing WPF Applications Using MVVM"},"content":{"rendered":"<p>Windows Presentation Foundation (WPF) is a framework provided by Microsoft for developing desktop applications. WPF offers powerful features that allow for the creation of excellent user interfaces, and we will explore in detail how to effectively design applications using the MVVM (Model-View-ViewModel) pattern.<\/p>\n<h2>1. Overview of MVVM Pattern<\/h2>\n<p>MVVM stands for Model-View-ViewModel, a design pattern created to separate user interface and business logic. This pattern consists of three main components:<\/p>\n<ul>\n<li><strong>Model:<\/strong> Responsible for the application\u2019s data and business logic. The model includes interactions with the database, data validation, and business rules.<\/li>\n<li><strong>View:<\/strong> Responsible for the visual elements shown to the user. In WPF, XAML (Extensible Application Markup Language) is used to define the view, displaying the UI elements with which users can interact.<\/li>\n<li><strong>ViewModel:<\/strong> Acts as an intermediary between the view and model. It includes business logic, handling events that occur in the view, and reflecting changes in model data to the view.<\/li>\n<\/ul>\n<h2>2. Advantages of the MVVM Pattern<\/h2>\n<p>Using the MVVM pattern provides the following benefits:<\/p>\n<ul>\n<li><strong>Maintainability:<\/strong> The code is clearly separated, making it easier to maintain and extend.<\/li>\n<li><strong>Testability:<\/strong> The ViewModel can be tested independently, allowing for the validation of business logic without tying it to the UI.<\/li>\n<li><strong>Reusability:<\/strong> ViewModel and Model can be reused in different views, improving productivity.<\/li>\n<li><strong>Data Binding:<\/strong> Taking advantage of WPF&#8217;s powerful data binding capabilities, synchronization between UI elements and the data model can be implemented easily.<\/li>\n<\/ul>\n<h2>3. Designing the Structure of WPF Applications<\/h2>\n<p>When designing a WPF application using the MVVM pattern, the basic project structure is organized as follows:<\/p>\n<pre>\n- MyApplication\n    - Models\n    - Views\n    - ViewModels\n    - Resources\n    - App.xaml\n    - MainWindow.xaml\n<\/pre>\n<p>Each folder contains classes for the respective components, allowing for clear separation of each element.<\/p>\n<h2>4. Defining the Model<\/h2>\n<p>The model part contains the data and business logic of the application. For example, let&#8217;s define a model for storing user information:<\/p>\n<pre>\npublic class User\n{\n    public string Name { get; set; }\n    public string Email { get; set; }\n}\n<\/pre>\n<p>This model includes fields for the user&#8217;s name and email address, with potential methods for interacting with the database.<\/p>\n<h2>5. Defining the View<\/h2>\n<p>The view consists of the UI elements displayed to the user. In WPF, views are defined using XAML. Below is XAML code defining a simple UI:<\/p>\n<pre>\n<window height=\"350\" title=\"Main Window\" width=\"525\" x:class=\"MyApplication.Views.MainWindow\" xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\" xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\">\n    <grid>\n        <textbox height=\"30\" margin=\"10\" width=\"200\" x:name=\"NameTextBox\"><\/textbox>\n        <textbox height=\"30\" margin=\"10,50,0,0\" width=\"200\" x:name=\"EmailTextBox\"><\/textbox>\n        <button click=\"OnSubmitClick\" content=\"Submit\" height=\"30\" margin=\"10,100,0,0\" width=\"100\"><\/button>\n    <\/grid>\n<\/window>\n<\/pre>\n<p>This example includes text boxes for entering the user&#8217;s name and email, along with a submit button.<\/p>\n<h2>6. Defining the ViewModel<\/h2>\n<p>The ViewModel serves as the linking mechanism between the view and model. It includes methods for storing user input in the model and updating model data when specific events (e.g., button clicks) occur:<\/p>\n<pre>\npublic class UserViewModel : INotifyPropertyChanged\n{\n    private User _user;\n    \n    public UserViewModel()\n    {\n        _user = new User();\n    }\n    \n    public string Name\n    {\n        get { return _user.Name; }\n        set\n        {\n            _user.Name = value;\n            OnPropertyChanged(nameof(Name));\n        }\n    }\n    \n    public string Email\n    {\n        get { return _user.Email; }\n        set\n        {\n            _user.Email = value;\n            OnPropertyChanged(nameof(Email));\n        }\n    }\n    \n    public void Submit()\n    {\n        \/\/ Logic for saving user data\n    }\n    \n    public event PropertyChangedEventHandler PropertyChanged;\n    \n    protected void OnPropertyChanged(string propertyName)\n    {\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n    }\n}\n<\/pre>\n<p>The ViewModel above includes properties for the user&#8217;s name and email, as well as a Submit method for submitting the data.<\/p>\n<h2>7. Setting Up Data Binding<\/h2>\n<p>We implement interaction between the view and ViewModel using WPF&#8217;s data binding feature. Binding can be set up in XAML as follows:<\/p>\n<pre>\n<window.datacontext>\n    <local:userviewmodel><\/local:userviewmodel>\n<\/window.datacontext>\n<\/pre>\n<p>Then, the Text properties of the TextBox can be bound as follows:<\/p>\n<pre>\n<textbox ...=\"\" text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"><\/textbox>\n<textbox ...=\"\" text=\"{Binding Email, UpdateSourceTrigger=PropertyChanged}\"><\/textbox>\n<\/pre>\n<p>Now, the values entered by the user in the text boxes automatically update the ViewModel&#8217;s Name and Email properties.<\/p>\n<h2>8. Handling Events<\/h2>\n<p>We implement handling the button click event to call the ViewModel&#8217;s Submit method:<\/p>\n<pre>\n<button command=\"{Binding SubmitCommand}\" content=\"Submit\" height=\"30\" margin=\"10,100,0,0\" width=\"100\"><\/button>\n<\/pre>\n<p>The above code configures the Command pattern so that the ViewModel&#8217;s Submit method is called upon button click.<\/p>\n<h2>9. Implementing Commands<\/h2>\n<p>We implement commands in the application to handle user interactions.<\/p>\n<pre>\npublic ICommand SubmitCommand => new RelayCommand(Submit);\n<\/pre>\n<p>Here, RelayCommand is a simple class that implements the ICommand interface.<\/p>\n<h2>10. Defining the Command Class<\/h2>\n<p>We define the RelayCommand class to implement commands:<\/p>\n<pre>\npublic class RelayCommand : ICommand\n{\n    private readonly Action<object> _execute;\n    private readonly Predicate<object> _canExecute;\n\n    public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)\n    {\n        _execute = execute ?? throw new ArgumentNullException(nameof(execute));\n        _canExecute = canExecute;\n    }\n\n    public event EventHandler CanExecuteChanged\n    {\n        add { CommandManager.RequerySuggested += value; }\n        remove { CommandManager.RequerySuggested -= value; }\n    }\n\n    public bool CanExecute(object parameter)\n    {\n        return _canExecute == null || _canExecute(parameter);\n    }\n\n    public void Execute(object parameter)\n    {\n        _execute(parameter);\n    }\n}\n<\/pre>\n<p>This RelayCommand class allows for easy implementation of various commands.<\/p>\n<h2>11. Linking View and ViewModel<\/h2>\n<p>We ensure that the View and ViewModel are well connected, checking that data binding and commands work properly to reflect changes in the user interface in real-time.<\/p>\n<h2>12. Dependency Injection and MVVM<\/h2>\n<p>To implement MVVM efficiently, it is advisable to use the Dependency Injection pattern to inject necessary dependencies into the ViewModel.<\/p>\n<p>This approach enhances testability and flexibility of the code.<\/p>\n<h2>Conclusion<\/h2>\n<p>By designing WPF applications in the MVVM pattern, we can enhance code readability and reusability while improving maintainability. The separation of business logic and UI through the MVVM pattern is a crucial aspect when crafting complex applications.<\/p>\n<p>Now we have effectively learned how to design and implement WPF applications using MVVM, allowing us to actively apply the MVVM pattern in real application development. We hope this article aids you in your WPF application development.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Windows Presentation Foundation (WPF) is a framework provided by Microsoft for developing desktop applications. WPF offers powerful features that allow for the creation of excellent user interfaces, and we will explore in detail how to effectively design applications using the MVVM (Model-View-ViewModel) pattern. 1. Overview of MVVM Pattern MVVM stands for Model-View-ViewModel, a design pattern &hellip; <a href=\"https:\/\/atmokpo.com\/w\/37763\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;WPF Tutorial, Designing WPF Applications Using MVVM&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[117],"tags":[],"class_list":["post-37763","post","type-post","status-publish","format-standard","hentry","category-wpf-programming"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WPF Tutorial, Designing WPF Applications Using MVVM - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/37763\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WPF Tutorial, Designing WPF Applications Using MVVM - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Windows Presentation Foundation (WPF) is a framework provided by Microsoft for developing desktop applications. WPF offers powerful features that allow for the creation of excellent user interfaces, and we will explore in detail how to effectively design applications using the MVVM (Model-View-ViewModel) pattern. 1. Overview of MVVM Pattern MVVM stands for Model-View-ViewModel, a design pattern &hellip; \ub354 \ubcf4\uae30 &quot;WPF Tutorial, Designing WPF Applications Using MVVM&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/37763\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T10:00:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:03:50+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/37763\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37763\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"WPF Tutorial, Designing WPF Applications Using MVVM\",\"datePublished\":\"2024-11-01T10:00:14+00:00\",\"dateModified\":\"2024-11-01T11:03:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37763\/\"},\"wordCount\":709,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF Programming\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/37763\/\",\"url\":\"https:\/\/atmokpo.com\/w\/37763\/\",\"name\":\"WPF Tutorial, Designing WPF Applications Using MVVM - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T10:00:14+00:00\",\"dateModified\":\"2024-11-01T11:03:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37763\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/37763\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/37763\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WPF Tutorial, Designing WPF Applications Using MVVM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WPF Tutorial, Designing WPF Applications Using MVVM - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/37763\/","og_locale":"ko_KR","og_type":"article","og_title":"WPF Tutorial, Designing WPF Applications Using MVVM - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Windows Presentation Foundation (WPF) is a framework provided by Microsoft for developing desktop applications. WPF offers powerful features that allow for the creation of excellent user interfaces, and we will explore in detail how to effectively design applications using the MVVM (Model-View-ViewModel) pattern. 1. Overview of MVVM Pattern MVVM stands for Model-View-ViewModel, a design pattern &hellip; \ub354 \ubcf4\uae30 \"WPF Tutorial, Designing WPF Applications Using MVVM\"","og_url":"https:\/\/atmokpo.com\/w\/37763\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T10:00:14+00:00","article_modified_time":"2024-11-01T11:03:50+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/37763\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/37763\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"WPF Tutorial, Designing WPF Applications Using MVVM","datePublished":"2024-11-01T10:00:14+00:00","dateModified":"2024-11-01T11:03:50+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/37763\/"},"wordCount":709,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF Programming"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/37763\/","url":"https:\/\/atmokpo.com\/w\/37763\/","name":"WPF Tutorial, Designing WPF Applications Using MVVM - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T10:00:14+00:00","dateModified":"2024-11-01T11:03:50+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/37763\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/37763\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/37763\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"WPF Tutorial, Designing WPF Applications Using MVVM"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=37763"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37763\/revisions"}],"predecessor-version":[{"id":37764,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37763\/revisions\/37764"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=37763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=37763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=37763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}