{"id":17914340,"url":"https://github.com/enisn/xamarin.forms.statemanager","last_synced_at":"2025-03-23T23:30:48.298Z","repository":{"id":95443653,"uuid":"274460842","full_name":"enisn/Xamarin.Forms.StateManager","owner":"enisn","description":"A simple UI state manager for Xamarin Forms","archived":false,"fork":false,"pushed_at":"2022-07-05T07:21:54.000Z","size":453,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-19T00:23:57.835Z","etag":null,"topics":["state","state-management","xamarin","xamarin-forms","xamarinforms"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/enisn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-23T16:53:11.000Z","updated_at":"2023-02-22T22:57:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"3fb56c08-2102-4678-9d44-8a1a7ee0d23d","html_url":"https://github.com/enisn/Xamarin.Forms.StateManager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enisn%2FXamarin.Forms.StateManager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enisn%2FXamarin.Forms.StateManager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enisn%2FXamarin.Forms.StateManager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enisn%2FXamarin.Forms.StateManager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/enisn","download_url":"https://codeload.github.com/enisn/Xamarin.Forms.StateManager/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245186440,"owners_count":20574551,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["state","state-management","xamarin","xamarin-forms","xamarinforms"],"created_at":"2024-10-28T19:57:45.778Z","updated_at":"2025-03-23T23:30:48.286Z","avatar_url":"https://github.com/enisn.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Xamarin.Forms.StateManager\nA simple \u0026 light UI state manager for Xamarin Forms.\n\n![Nuget](https://img.shields.io/nuget/v/Xamarin.Forms.StateManager?logo=nuget\u0026style=flat-square)\n![CodeFactor](https://www.codefactor.io/repository/github/enisn/xamarin.forms.statemanager/badge/master)\n\n## Why?\n### Performance\n\nNormally, states can be managed via binding `IsVisible` property of Views Controls. But when you use `IsVisible` property, that object will be initilized and allocated lots of memory on ram and it makes latency when openning page.\nThis StateManager uses **DataTemplate** instead of initializing all components. Only views related to the current state will be initialized and when state has changed, they will be removed and next state elements will be placed at UI.\n\n### Ease of use\n\nThis StateManager makes much more easier to manage states on XAML pages. This provides much more manageable XAML code and easy to read.\n\n\nOn the situation below, both of component will be initialized at the beginning:\n```xml\n\u003cActivityIndicator IsRunning=\"{Binding IsBusy}\" IsVisible=\"{Binding IsBusy\"/\u003e\n\u003cLabel Text=\"{Binding MyData}\" IsVisible=\"{Binding IsBusy, Converter={StaticResource BoolInverter}}\" /\u003e\n```\n\nBut state manager provides you to completely seperate your states and it uses **lazy load** for better performance.\n\n\n# Instructions\n\n## Set-Up\n\n- Install NuGet Package `Xamarin.Forms.StateManager` only to your portable library.\n\n\n***\n\n## Usage\n\n- Add following namespace at the top of your XAML page:\n\n`xmlns:sm=\"clr-namespace:Xamarin.Forms.StateManager.Controls;assembly=Xamarin.Forms.StateManager\"`\n\n- Use **StateManager** anywhere you need:\n\n```xml\n   \u003cStackLayout VerticalOptions=\"CenterAndExpand\" Padding=\"25\"\u003e\n        \u003cButton Text=\"Reload\" Command=\"{Binding LoadCommand}\" HorizontalOptions=\"Center\" Margin=\"50\"/\u003e\n        \u003cFrame CornerRadius=\"20\" HasShadow=\"True\"\u003e\n            \u003csm:StateManager State=\"{Binding CurrentState}\"\u003e\n\n                \u003csm:StateTemplate State=\"Loading\"\u003e\n                    \u003cDataTemplate\u003e\n                        \u003cActivityIndicator IsRunning=\"True\"/\u003e\n                    \u003c/DataTemplate\u003e\n                \u003c/sm:StateTemplate\u003e\n\n                \u003csm:StateTemplate State=\"Loaded\"\u003e\n                    \u003cDataTemplate\u003e\n                        \u003cLabel Text=\"{Binding Content}\" HorizontalOptions=\"Center\" VerticalOptions=\"CenterAndExpand\" /\u003e\n                    \u003c/DataTemplate\u003e\n                \u003c/sm:StateTemplate\u003e\n                \n                \u003csm:StateTemplate State=\"Failed\"\u003e\n                    \u003cDataTemplate\u003e\n                        \u003cStackLayout\u003e\n                            \u003cLabel Text=\"Failed to load :(\" HorizontalOptions=\"Center\" VerticalOptions=\"CenterAndExpand\" /\u003e\n                            \u003cButton Text=\"Retry\" Command=\"{Binding LoadCommand}\"/\u003e\n                        \u003c/StackLayout\u003e\n                    \u003c/DataTemplate\u003e\n                \u003c/sm:StateTemplate\u003e\n            \u003c/sm:StateManager\u003e\n        \u003c/Frame\u003e\n    \u003c/StackLayout\u003e\n```\n\n- You must define a default State at your **ViewModel**\n\n```csharp\npublic class MainViewModel : BindableObject\n{\n    private string currentState = \"Failed\"; // Must define a default state\n    private string content;\n\n    private static readonly Random random = new Random();\n    public MainViewModel()\n    {\n        this.LoadCommand = new Command(Load);\n    }\n\n    public string CurrentState { get =\u003e currentState; set { currentState = value; OnPropertyChanged(); } }\n\n    public string Content { get =\u003e content; set { content = value; OnPropertyChanged(); } }\n\n    public ICommand LoadCommand { get; set; }\n\n    private async void Load()\n    {\n        this.CurrentState = \"Loading\";\n\n        await Task.Delay(2000);\n\n        var tmp = random.Next(0, 100);\n        if (tmp \u003e 50)\n        {\n            this.CurrentState = \"Failed\";\n        }\n        else\n        {\n            this.CurrentState = \"Loaded\";\n            this.Content = \"This is loaded content.\";\n        }\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenisn%2Fxamarin.forms.statemanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fenisn%2Fxamarin.forms.statemanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenisn%2Fxamarin.forms.statemanager/lists"}