{"id":31164209,"url":"https://github.com/reactiveui/reactiveui.avalonia","last_synced_at":"2026-04-20T15:01:15.355Z","repository":{"id":312938146,"uuid":"1049224431","full_name":"reactiveui/ReactiveUI.Avalonia","owner":"reactiveui","description":"Avalonia related components for the ReactiveUI family","archived":false,"fork":false,"pushed_at":"2025-10-17T18:44:51.000Z","size":141,"stargazers_count":9,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-20T18:40:05.205Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reactiveui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["reactivemarbles"]}},"created_at":"2025-09-02T17:00:00.000Z","updated_at":"2025-10-14T07:43:10.000Z","dependencies_parsed_at":"2025-09-09T02:29:43.374Z","dependency_job_id":"7a9a9bef-fcc9-48f2-95b9-02367ef1d76e","html_url":"https://github.com/reactiveui/ReactiveUI.Avalonia","commit_stats":null,"previous_names":["reactiveui/avalonia","reactiveui/reactiveui.avalonia"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/reactiveui/ReactiveUI.Avalonia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Avalonia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Avalonia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Avalonia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Avalonia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reactiveui","download_url":"https://codeload.github.com/reactiveui/ReactiveUI.Avalonia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Avalonia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280872123,"owners_count":26405632,"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","status":"online","status_checked_at":"2025-10-24T02:00:06.418Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2025-09-19T07:49:38.055Z","updated_at":"2026-03-01T08:08:19.959Z","avatar_url":"https://github.com/reactiveui.png","language":"C#","funding_links":["https://github.com/sponsors/reactivemarbles"],"categories":[],"sub_categories":[],"readme":"[![Build](https://github.com/reactiveui/ReactiveUI.Avalonia/actions/workflows/ci-build.yml/badge.svg)](https://github.com/reactiveui/ReactiveUI.Avalonia/actions/workflows/ci-build.yml)\n[![Code Coverage](https://codecov.io/gh/reactiveui/ReactiveUI.Avalonia/branch/main/graph/badge.svg)](https://codecov.io/gh/reactiveui/ReactiveUI.Avalonia)\n[![#yourfirstpr](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](https://reactiveui.net/contribute)\n[![](https://img.shields.io/badge/chat-slack-blue.svg)](https://reactiveui.net/slack)\n[![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Avalonia.svg)](https://www.nuget.org/packages/ReactiveUI.Avalonia/)\n\n\u003cbr\u003e\n\u003ca href=\"https://github.com/reactiveui/reactiveui\"\u003e\n  \u003cimg width=\"160\" height=\"160\" src=\"https://raw.githubusercontent.com/reactiveui/styleguide/master/logo/main.png\"\u003e\n\u003c/a\u003e\n\u003cbr\u003e\n\n# ReactiveUI for Avalonia UI\n\nThis package provides [ReactiveUI](https://reactiveui.net/) bindings and helpers for the [Avalonia UI](https://avaloniaui.net/) framework, enabling you to build composable, cross-platform model-view-viewmodel (MVVM) applications for Windows, macOS, and Linux.\n\n---\n## Packages\n\nInstall the packages that match your preferred dependency injection container. The core package is always required.\n\n- Core\n  - [![ReactiveUI.Avalonia](https://img.shields.io/nuget/v/ReactiveUI.Avalonia.svg)](https://www.nuget.org/packages/ReactiveUI.Avalonia/)\n- DI integrations\n  - [![ReactiveUI.Avalonia.Autofac](https://img.shields.io/nuget/v/ReactiveUI.Avalonia.Autofac.svg)](https://www.nuget.org/packages/ReactiveUI.Avalonia.Autofac)\n  - [![ReactiveUI.Avalonia.DryIoc](https://img.shields.io/nuget/v/ReactiveUI.Avalonia.DryIoc.svg)](https://www.nuget.org/packages/ReactiveUI.Avalonia.DryIoc)\n  - [![ReactiveUI.Avalonia.Microsoft.Extensions.DependencyInjection](https://img.shields.io/nuget/v/ReactiveUI.Avalonia.Microsoft.Extensions.DependencyInjection.svg)](https://www.nuget.org/packages/ReactiveUI.Avalonia.Microsoft.Extensions.DependencyInjection)\n  - [![ReactiveUI.Avalonia.Ninject](https://img.shields.io/nuget/v/ReactiveUI.Avalonia.Ninject.svg)](https://www.nuget.org/packages/ReactiveUI.Avalonia.Ninject)\n\nAll libraries target multiple frameworks including .NET Standard 2.0 and modern .NET (.NET 8/9/10) for broad compatibility.\n\n---\n## Recommended setup (ReactiveUIBuilder)\n\nThe recommended approach for new projects is to use the `ReactiveUIBuilder` via the `UseReactiveUI` and `UseReactiveUIWith...` extensions. This ensures consistent registration of schedulers, activation/binding hooks, and view discovery.\n\nNamespaces to import in your startup:\n\n```csharp\nusing Avalonia; // AppBuilder\nusing ReactiveUI.Avalonia; // UseReactiveUI, RegisterReactiveUIViews* (core)\nusing ReactiveUI.Avalonia.Splat; // Autofac, DryIoc, Ninject, Microsoft.Extensions.DependencyInjection integrations\n```\n\nMinimal setup (no external DI container):\n\n```csharp\npublic static class Program\n{\n    public static void Main(string[] args) =\u003e BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);\n\n    public static AppBuilder BuildAvaloniaApp() =\u003e AppBuilder\n        .Configure\u003cApp\u003e()\n        .UsePlatformDetect()\n        .UseReactiveUI(rxui =\u003e\n        {\n            // Optional: add custom registration here via rxui.WithRegistration(...)\n        })\n        .RegisterReactiveUIViewsFromEntryAssembly();\n}\n```\n\nWith Autofac:\n\n```csharp\npublic static AppBuilder BuildAvaloniaApp() =\u003e AppBuilder\n    .Configure\u003cApp\u003e()\n    .UsePlatformDetect()\n    .UseReactiveUIWithAutofac(\n        container =\u003e\n        {\n            // Register your services/view models\n            // container.RegisterType\u003cMainViewModel\u003e();\n        },\n        withResolver: resolver =\u003e\n        {\n            // Optional: access the Autofac resolver/lifetime scope\n        },\n        withReactiveUIBuilder: rxui =\u003e\n        {\n            // Optional: add ReactiveUI customizations\n        })\n    .RegisterReactiveUIViewsFromEntryAssembly();\n```\n\nWith DryIoc:\n\n```csharp\npublic static AppBuilder BuildAvaloniaApp() =\u003e AppBuilder\n    .Configure\u003cApp\u003e()\n    .UsePlatformDetect()\n    .UseReactiveUIWithDryIoc(\n        container =\u003e\n        {\n            // container.Register\u003cMainViewModel\u003e(Reuse.Singleton);\n        },\n        withReactiveUIBuilder: rxui =\u003e\n        {\n            // Optional ReactiveUI customizations\n        })\n    .RegisterReactiveUIViewsFromEntryAssembly();\n```\n\nWith Microsoft.Extensions.DependencyInjection:\n\n```csharp\npublic static AppBuilder BuildAvaloniaApp() =\u003e AppBuilder\n    .Configure\u003cApp\u003e()\n    .UsePlatformDetect()\n    .UseReactiveUIWithMicrosoftDependencyResolver(\n        services =\u003e\n        {\n            // services.AddSingleton\u003cMainViewModel\u003e();\n        },\n        withResolver: sp =\u003e\n        {\n            // Optional: access ServiceProvider\n        })\n    ;\n```\n\nNote: `UseReactiveUIWithMicrosoftDependencyResolver(...)` builds the `ServiceProvider` during setup, so make sure you register all services (including any `IViewFor\u003cT\u003e` views) in the `services =\u003e { ... }` callback.\n\nWith Ninject:\n\n```csharp\npublic static AppBuilder BuildAvaloniaApp() =\u003e AppBuilder\n    .Configure\u003cApp\u003e()\n    .UsePlatformDetect()\n    .UseReactiveUIWithNinject(\n        kernel =\u003e\n        {\n            // kernel.Bind\u003cMainViewModel\u003e().ToSelf().InSingletonScope();\n        },\n        withReactiveUIBuilder: rxui =\u003e\n        {\n            // Optional ReactiveUI customizations\n        })\n    .RegisterReactiveUIViewsFromEntryAssembly();\n```\n\nNotes\n- `UseReactiveUI` sets `RxApp.MainThreadScheduler` to `AvaloniaScheduler.Instance` and registers the Avalonia-specific activation and binding services.\n- `RegisterReactiveUIViewsFromEntryAssembly()` scans your entry assembly and registers any types implementing `IViewFor\u003cTViewModel\u003e` for view location/navigation.\n- For existing apps, you can keep using `UseReactiveUI()` without a DI container and register services into `Splat` directly if you prefer.\n\n---\n## Manual setup (without container mixins)\n\nYou can configure a custom container using the generic `UseReactiveUIWithDIContainer` if you don’t use one of the provided integrations:\n\n```csharp\nAppBuilder\n    .Configure\u003cApp\u003e()\n    .UseReactiveUIWithDIContainer(\n        containerFactory: () =\u003e new MyContainer(),\n        containerConfig: container =\u003e\n        {\n            // configure container\n        },\n        dependencyResolverFactory: container =\u003e new MySplatResolver(container))\n    .RegisterReactiveUIViewsFromEntryAssembly();\n```\n\n---\n## Quick example: first reactive view\n\n```csharp\n// View model\nusing ReactiveUI;\n\npublic class MyViewModel : ReactiveObject\n{\n    private string _greeting = \"Hello, Reactive World!\";\n    public string Greeting\n    {\n        get =\u003e _greeting;\n        set =\u003e this.RaiseAndSetIfChanged(ref _greeting, value);\n    }\n}\n```\n\n```xml\n\u003c!-- MainView.axaml --\u003e\n\u003cUserControl x:Class=\"MyAvaloniaApp.Views.MainView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:rxui=\"using:ReactiveUI.Avalonia\"\u003e\n    \u003cStackPanel HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\u003e\n        \u003cTextBlock x:Name=\"GreetingTextBlock\" FontSize=\"24\"/\u003e\n    \u003c/StackPanel\u003e\n\u003c/UserControl\u003e\n```\n\n```csharp\n// MainView.axaml.cs\nusing ReactiveUI;\nusing ReactiveUI.Avalonia;\nusing System.Reactive.Disposables;\n\npublic partial class MainView : ReactiveUserControl\u003cMyViewModel\u003e\n{\n    public MainView()\n    {\n        InitializeComponent();\n        ViewModel = new MyViewModel();\n\n        this.WhenActivated(disposables =\u003e\n        {\n            this.OneWayBind(ViewModel, vm =\u003e vm.Greeting, v =\u003e v.GreetingTextBlock.Text)\n                .DisposeWith(disposables);\n        });\n    }\n}\n```\n\n---\n## API reference\n\n### ReactiveUI.Avalonia (core)\n\nKey extension methods on `AppBuilder`:\n- `UseReactiveUI()` — initialize ReactiveUI for Avalonia (scheduler, activation, bindings)\n- `UseReactiveUI(Action\u003cReactiveUIBuilder\u003e)` — initialize with the `ReactiveUIBuilder` for additional configuration\n- `RegisterReactiveUIViews(params Assembly[])` — scan and register views implementing `IViewFor\u003cT\u003e`\n- `RegisterReactiveUIViewsFromEntryAssembly()` — convenience overload to scan the entry assembly\n- `RegisterReactiveUIViewsFromAssemblyOf\u003cTMarker\u003e()` — scan a specific assembly\n- `UseReactiveUIWithDIContainer\u003cTContainer\u003e(...)` — bring-your-own container integration via an `IDependencyResolver`\n\nImportant types registered by default:\n- `IActivationForViewFetcher` ? `AvaloniaActivationForViewFetcher`\n- `IPropertyBindingHook` ? `AutoDataTemplateBindingHook`\n- `ICreatesCommandBinding` ? `AvaloniaCreatesCommandBinding`\n- `ICreatesObservableForProperty` ? `AvaloniaObjectObservableForProperty`\n- `RxApp.MainThreadScheduler` set to `AvaloniaScheduler.Instance`\n\nControls and helpers:\n- `RoutedViewHost` — view host that displays the view for the current `RoutingState`\n- `ReactiveUserControl\u003cTViewModel\u003e`, `ReactiveWindow\u003cTViewModel\u003e` — base classes for reactive views\n\n### ReactiveUI.Avalonia.Autofac\n\nExtension methods on `AppBuilder` (namespace `Avalonia.ReactiveUI.Splat`):\n- `UseReactiveUIWithAutofac(Action\u003cContainerBuilder\u003e containerConfig, Action\u003cAutofacDependencyResolver\u003e? withResolver = null)`\n- `UseReactiveUIWithAutofac(Action\u003cContainerBuilder\u003e containerConfig, Action\u003cAutofacDependencyResolver\u003e? withResolver = null, Action\u003cReactiveUIBuilder\u003e? withReactiveUIBuilder = null)`\n\nWhat it does:\n- Sets up `Splat` with Autofac, initializes ReactiveUI for Avalonia, builds your container, and optionally exposes the Autofac resolver.\n\n### ReactiveUI.Avalonia.DryIoc\n\nExtension methods on `AppBuilder` (namespace `ReactiveUI.Avalonia.Splat`):\n- `UseReactiveUIWithDryIoc(Action\u003cContainer\u003e containerConfig)`\n- `UseReactiveUIWithDryIoc(Action\u003cContainer\u003e containerConfig, Action\u003cReactiveUIBuilder\u003e? withReactiveUIBuilder = null)`\n\nWhat it does:\n- Wires `Splat` to DryIoc, initializes ReactiveUI for Avalonia, and lets you register services on the container.\n\n### ReactiveUI.Avalonia.Microsoft.Extensions.DependencyInjection\n\nExtension methods on `AppBuilder` (namespace `ReactiveUI.Avalonia.Splat`):\n- `UseReactiveUIWithMicrosoftDependencyResolver(Action\u003cIServiceCollection\u003e containerConfig, Action\u003cIServiceProvider?\u003e? withResolver = null)`\n- `UseReactiveUIWithMicrosoftDependencyResolver(Action\u003cIServiceCollection\u003e containerConfig, Action\u003cIServiceProvider?\u003e? withResolver = null, Action\u003cReactiveUIBuilder\u003e? withReactiveUIBuilder = null)`\n\nWhat it does:\n- Sets up `Splat` using `IServiceCollection`/`ServiceProvider`, initializes ReactiveUI for Avalonia, and exposes the built provider if you need it.\n\n### ReactiveUI.Avalonia.Ninject\n\nExtension methods on `AppBuilder` (namespace `ReactiveUI.Avalonia.Splat`):\n- `UseReactiveUIWithNinject(Action\u003cStandardKernel\u003e containerConfig)`\n- `UseReactiveUIWithNinject(Action\u003cStandardKernel\u003e containerConfig, Action\u003cReactiveUIBuilder\u003e? withReactiveUIBuilder = null)`\n\nWhat it does:\n- Wires `Splat` to Ninject, initializes ReactiveUI for Avalonia, and lets you configure bindings on the kernel.\n\n---\n## Tutorial: Mastering ReactiveUI with Avalonia\n\nWelcome to the `ReactiveUI.Avalonia` guide! This tutorial walks you through setting up an Avalonia app with ReactiveUI. We start with the basics and build up to a reactive application.\n\n`ReactiveUI.Avalonia` provides the necessary bindings and helpers to seamlessly integrate the ReactiveUI MVVM framework with your Avalonia projects, enabling elegant, testable, and maintainable code.\n\n### Chapter 1: Getting Started - Your First Reactive View\n\n#### 1. Installation\n\nAdd the `ReactiveUI.Avalonia` package to your Avalonia application project file.\n\n```xml\n\u003cPackageReference Include=\"ReactiveUI.Avalonia\" Version=\"11.3.0\" /\u003e\n```\n\n#### 2. Initialization (recommended)\n\nUse the builder-based setup shown above (see \"Recommended setup\"). For a minimal variant:\n\n```csharp\nAppBuilder.Configure\u003cApp\u003e()\n    .UsePlatformDetect()\n    .UseReactiveUI()\n    .RegisterReactiveUIViewsFromEntryAssembly();\n```\n\n#### 3. Create a ViewModel\n\n```csharp\nusing ReactiveUI;\n\npublic class MyViewModel : ReactiveObject\n{\n    private string _greeting;\n\n    public string Greeting\n    {\n        get =\u003e _greeting;\n        set =\u003e this.RaiseAndSetIfChanged(ref _greeting, value);\n    }\n\n    public MyViewModel() =\u003e Greeting = \"Hello, Reactive World!\";\n}\n```\n\n#### 4. Create a Reactive View\n\n```xml\n\u003c!-- MainView.axaml --\u003e\n\u003cUserControl x:Class=\"MyAvaloniaApp.Views.MainView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:rxui=\"using:ReactiveUI.Avalonia\"\u003e\n    \u003cStackPanel HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\u003e\n        \u003cTextBlock x:Name=\"GreetingTextBlock\" FontSize=\"24\"/\u003e\n    \u003c/StackPanel\u003e\n\u003c/UserControl\u003e\n```\n\n```csharp\n// MainView.axaml.cs\nusing ReactiveUI;\nusing ReactiveUI.Avalonia;\nusing System.Reactive.Disposables;\n\npublic partial class MainView : ReactiveUserControl\u003cMyViewModel\u003e\n{\n    public MainView()\n    {\n        InitializeComponent();\n        ViewModel = new MyViewModel();\n\n        this.WhenActivated(disposables =\u003e\n        {\n            this.OneWayBind(ViewModel, vm =\u003e vm.Greeting, v =\u003e v.GreetingTextBlock.Text)\n                .DisposeWith(disposables);\n        });\n    }\n}\n```\n\n### Chapter 2: Handling User Interaction with ReactiveCommands\n\nAdd a command to the view model and bind it in the view.\n\n```csharp\nusing ReactiveUI;\nusing System;\nusing System.Reactive;\n\npublic class MyViewModel : ReactiveObject\n{\n    public ReactiveCommand\u003cUnit, Unit\u003e GenerateGreetingCommand { get; }\n\n    private string _greeting = \"Hello, Reactive World!\";\n    public string Greeting\n    {\n        get =\u003e _greeting;\n        set =\u003e this.RaiseAndSetIfChanged(ref _greeting, value);\n    }\n\n    public MyViewModel()\n    {\n        GenerateGreetingCommand = ReactiveCommand.Create(() =\u003e\n        {\n            Greeting = $\"Hello from Avalonia! The time is {DateTime.Now.ToLongTimeString()}\";\n        });\n    }\n}\n```\n\n```xml\n\u003cStackPanel HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\u003e\n    \u003cTextBlock x:Name=\"GreetingTextBlock\" FontSize=\"24\"/\u003e\n    \u003cButton x:Name=\"GenerateGreetingButton\" Content=\"Generate\" Margin=\"0,20,0,0\"/\u003e\n\u003c/StackPanel\u003e\n```\n\n```csharp\nthis.WhenActivated(disposables =\u003e\n{\n    this.OneWayBind(ViewModel, vm =\u003e vm.Greeting, v =\u003e v.GreetingTextBlock.Text)\n        .DisposeWith(disposables);\n\n    this.BindCommand(ViewModel, vm =\u003e vm.GenerateGreetingCommand, v =\u003e v.GenerateGreetingButton)\n        .DisposeWith(disposables);\n});\n```\n\n### Chapter 3: Navigating with `RoutedViewHost`\n\nSet up a router and display views based on navigation state.\n\n```csharp\nusing ReactiveUI;\n\npublic class AppViewModel : ReactiveObject, IScreen\n{\n    public RoutingState Router { get; } = new RoutingState();\n\n    public AppViewModel() =\u003e Router.Navigate.Execute(new MyViewModel());\n}\n```\n\n```xml\n\u003c!-- MainWindow.axaml --\u003e\n\u003cWindow xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:rxui=\"using:ReactiveUI.Avalonia\"\n        x:Class=\"MyAvaloniaApp.MainWindow\"\u003e\n    \u003cGrid\u003e\n        \u003crxui:RoutedViewHost Router=\"{Binding Router}\" /\u003e\n    \u003c/Grid\u003e\n\u003c/Window\u003e\n```\n\nRegister views manually or scan assemblies:\n\n```csharp\nusing ReactiveUI;\nusing ReactiveUI.Avalonia;\nusing Splat;\n\nLocator.CurrentMutable.Register(() =\u003e new MainView(), typeof(IViewFor\u003cMyViewModel\u003e));\n// or:\nAppBuilder.Configure\u003cApp\u003e().UseReactiveUI().RegisterReactiveUIViewsFromEntryAssembly();\n```\n\n---\n## Thanks\n\nWe want to thank the following contributors and libraries that help make ReactiveUI.Avalonia possible:\n\n### Core Libraries\n\n  - **Avalonia UI**: [Avalonia](https://avaloniaui.net/) - The cross-platform UI framework.\n  - **System.Reactive**: [Reactive Extensions for .NET](https://github.com/dotnet/reactive) - The foundation of ReactiveUI's asynchronous API.\n  - **Splat**: [Splat](https://github.com/reactiveui/splat) - Cross-platform utilities and service location.\n  - **ReactiveUI**: [ReactiveUI](https://github.com/reactiveui/reactiveui) - The core MVVM framework.\n\n---\n\n## Sponsorship\n\nThe core team members, ReactiveUI contributors and contributors in the ecosystem do this open-source work in their free time. If you use ReactiveUI, a serious task, and you'd like us to invest more time on it, please donate. This project increases your income/productivity too. It makes development and applications faster and it reduces the required bandwidth.\n\n[Become a sponsor](https://github.com/sponsors/reactivemarbles).\n\nThis is how we use the donations:\n\n  * Allow the core team to work on ReactiveUI\n  * Thank contributors if they invested a large amount of time in contributing\n  * Support projects in the ecosystem\n\n---\n## Support\n\nIf you have a question, please see if any discussions in our [GitHub Discussions](https://github.com/reactiveui/ReactiveUI.Avalonia/discussions) or [GitHub issues](https://github.com/reactiveui/ReactiveUI.Avalonia/issues) have already answered it.\n\nIf you want to discuss something or just need help, here is our [Slack room](https://reactiveui.net/slack), where there are always individuals looking to help out!\n\nPlease do not open GitHub issues for support requests.\n\nPlease do not open GitHub issues for general support requests.\n\n---\n## Contribute\n\nReactiveUI.Avalonia is developed under an OSI-approved open source license, making it freely usable and distributable, even for commercial use.\n\nIf you want to submit pull requests please first open a [GitHub issue](https://github.com/reactiveui/ReactiveUI.Avalonia/issues/new/choose) to discuss. We are first time PR contributors friendly.\n\nSee [Contribution Guidelines](https://www.reactiveui.net/contribute/) for further information how to contribute changes.\n\n---\n## License\n\nReactiveUI.Avalonia is licensed under the [MIT License](https://github.com/reactiveui/ReactiveUI.Avalonia/blob/main/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactiveui%2Freactiveui.avalonia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freactiveui%2Freactiveui.avalonia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactiveui%2Freactiveui.avalonia/lists"}