{"id":13629460,"url":"https://github.com/HavenDV/DependencyPropertyGenerator","last_synced_at":"2025-04-17T09:34:05.112Z","repository":{"id":37247881,"uuid":"490205201","full_name":"HavenDV/DependencyPropertyGenerator","owner":"HavenDV","description":"Dependency property, routed event and weak event source generator for WPF/UWP/WinUI/Uno/Avalonia/MAUI platforms.","archived":false,"fork":false,"pushed_at":"2024-11-04T03:20:29.000Z","size":1125,"stargazers_count":118,"open_issues_count":9,"forks_count":9,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-05T18:46:58.071Z","etag":null,"topics":["avalonia","avaloniaui","csharp","csharp-sourcegenerator","dependency-property","dotnet","dp","generator","incrementral-generator","maui","net5","net6","routed-event","source-generator","uno","uno-platform","uwp","winui","wpf"],"latest_commit_sha":null,"homepage":"","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/HavenDV.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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},"funding":{"patreon":"havendv","ko_fi":"havendv","custom":["https://www.paypal.me/havendv","https://www.buymeacoffee.com/havendv","https://www.upwork.com/freelancers/~017b1ad6f6af9cc189"]}},"created_at":"2022-05-09T08:53:48.000Z","updated_at":"2024-11-04T03:20:26.000Z","dependencies_parsed_at":"2024-01-16T01:23:33.442Z","dependency_job_id":"fc475481-4ddf-4236-b2de-7ff08cc55886","html_url":"https://github.com/HavenDV/DependencyPropertyGenerator","commit_stats":{"total_commits":280,"total_committers":5,"mean_commits":56.0,"dds":0.525,"last_synced_commit":"1b30fadf5fb7d8bba1899e5ad91828d39c45e769"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HavenDV%2FDependencyPropertyGenerator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HavenDV%2FDependencyPropertyGenerator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HavenDV%2FDependencyPropertyGenerator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HavenDV%2FDependencyPropertyGenerator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HavenDV","download_url":"https://codeload.github.com/HavenDV/DependencyPropertyGenerator/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223751138,"owners_count":17196579,"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":["avalonia","avaloniaui","csharp","csharp-sourcegenerator","dependency-property","dotnet","dp","generator","incrementral-generator","maui","net5","net6","routed-event","source-generator","uno","uno-platform","uwp","winui","wpf"],"created_at":"2024-08-01T22:01:11.287Z","updated_at":"2024-11-08T20:31:00.430Z","avatar_url":"https://github.com/HavenDV.png","language":"C#","readme":"# DependencyPropertyGenerator\n\n[![Nuget package](https://img.shields.io/nuget/vpre/DependencyPropertyGenerator)](https://www.nuget.org/packages/DependencyPropertyGenerator/)\n[![CI/CD](https://github.com/HavenDV/DependencyPropertyGenerator/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/HavenDV/DependencyPropertyGenerator/actions/workflows/main.yml)\n[![License: MIT](https://img.shields.io/github/license/HavenDV/DependencyPropertyGenerator)](https://github.com/HavenDV/DependencyPropertyGenerator/blob/main/LICENSE.txt)\n[![Discord](https://img.shields.io/discord/988253265550532680?label=Discord\u0026logo=discord\u0026logoColor=white\u0026color=d82679)](https://discord.gg/g8u2t9dKgE)\n\nDependency property, routed event and weak event source generator for WPF/UWP/WinUI/Uno/Avalonia/MAUI platforms.  \n\n## Usage\n```cs\nusing DependencyPropertyGenerator;\nusing System.Windows.Controls;\n\n#nullable enable\n\nnamespace H.Generators.IntegrationTests;\n\n[DependencyProperty\u003cbool\u003e(\"IsSpinning\", DefaultValue = true, Category = \"Category\", Description = \"Description\")]\npublic partial class MyControl : UserControl\n{\n    // Optional\n    partial void OnIsSpinningChanged(bool oldValue, bool newValue)\n    {\n    }\n}\n\n[AttachedDependencyProperty\u003cobject, TreeView\u003e(\"SelectedItem\", DefaultBindingMode = DefaultBindingMode.TwoWay)]\npublic static partial class TreeViewExtensions\n{\n    // Optional\n    static partial void OnSelectedItemChanged(TreeView sender, object? oldValue, object? newValue)\n    {\n    }\n}\n```\nwill generate:\n```cs\n//HintName: MyControl.Properties.IsSpinning.generated.cs\n\n#nullable enable\n\nnamespace H.Generators.IntegrationTests\n{\n    public partial class MyControl\n    {\n        /// \u003csummary\u003e\n        /// Description\u003cbr/\u003e\n        /// Default value: true\n        /// \u003c/summary\u003e\n        public static readonly global::System.Windows.DependencyProperty IsSpinningProperty =\n            global::System.Windows.DependencyProperty.Register(\n                name: \"IsSpinning\",\n                propertyType: typeof(bool),\n                ownerType: typeof(global::H.Generators.IntegrationTests.MyControl),\n                typeMetadata: new global::System.Windows.FrameworkPropertyMetadata(\n                    defaultValue: (bool)true,\n                    flags: global::System.Windows.FrameworkPropertyMetadataOptions.None,\n                    propertyChangedCallback: static (sender, args) =\u003e\n                    {\n                        ((global::H.Generators.IntegrationTests.MyControl)sender).OnIsSpinningChanged(\n                            (bool)args.OldValue,\n                            (bool)args.NewValue);\n                    },\n                    coerceValueCallback: null,\n                    isAnimationProhibited: false),\n                validateValueCallback: null);\n\n        /// \u003csummary\u003e\n        /// Description\u003cbr/\u003e\n        /// Default value: true\n        /// \u003c/summary\u003e\n        [global::System.ComponentModel.Category(\"Category\")]\n        [global::System.ComponentModel.Description(\"Description\")]\n        public bool IsSpinning\n        {\n            get =\u003e (bool)GetValue(IsSpinningProperty);\n            set =\u003e SetValue(IsSpinningProperty, value);\n        }\n\n        partial void OnIsSpinningChanged();\n        partial void OnIsSpinningChanged(bool newValue);\n        partial void OnIsSpinningChanged(bool oldValue, bool newValue);\n    }\n}\n```\n```cs\n//HintName: TreeViewExtensions.AttachedProperties.SelectedItem.generated.cs\n\n#nullable enable\n\nnamespace H.Generators.IntegrationTests\n{\n    public static partial class TreeViewExtensions\n    {\n        /// \u003csummary\u003e\n        /// Default value: default(object)\n        /// \u003c/summary\u003e\n        public static readonly global::System.Windows.DependencyProperty SelectedItemProperty =\n            global::System.Windows.DependencyProperty.RegisterAttached(\n                name: \"SelectedItem\",\n                propertyType: typeof(object),\n                ownerType: typeof(global::H.Generators.IntegrationTests.TreeViewExtensions),\n                defaultMetadata: new global::System.Windows.FrameworkPropertyMetadata(\n                    defaultValue: default(object),\n                    flags: global::System.Windows.FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,\n                    propertyChangedCallback: static (sender, args) =\u003e\n                    {\n                        OnSelectedItemChanged(\n                            (global::System.Windows.Controls.TreeView)sender,\n                            (object?)args.OldValue,\n                            (object?)args.NewValue);\n                    },\n                    coerceValueCallback: null,\n                    isAnimationProhibited: false),\n                validateValueCallback: null);\n\n        /// \u003csummary\u003e\n        /// Default value: default(object)\n        /// \u003c/summary\u003e\n        public static void SetSelectedItem(global::System.Windows.DependencyObject element, object? value)\n        {\n            element = element ?? throw new global::System.ArgumentNullException(nameof(element));\n\n            element.SetValue(SelectedItemProperty, value);\n        }\n\n        /// \u003csummary\u003e\n        /// Default value: default(object)\n        /// \u003c/summary\u003e\n        [global::System.Windows.AttachedPropertyBrowsableForType(typeof(global::System.Windows.Controls.TreeView))]\n        public static object? GetSelectedItem(global::System.Windows.DependencyObject element)\n        {\n            element = element ?? throw new global::System.ArgumentNullException(nameof(element));\n\n            return (object?)element.GetValue(SelectedItemProperty);\n        }\n\n        static partial void OnSelectedItemChanged();\n        static partial void OnSelectedItemChanged(global::System.Windows.Controls.TreeView treeView);\n        static partial void OnSelectedItemChanged(global::System.Windows.Controls.TreeView treeView, object? newValue);\n        static partial void OnSelectedItemChanged(global::System.Windows.Controls.TreeView treeView, object? oldValue, object? newValue);\n    }\n}\n```\n\n## Advanced usage\n### new object/struct() expressions in DefaultValue\nWhile it's [generally not recommended](https://devblogs.microsoft.com/oldnewthing/20191002-00/?p=102950) \nto use new expressions in properties, a generator provides this capability:\n```cs\npublic readonly record struct Data();\n\n[AttachedDependencyProperty\u003cobject, TreeView\u003e(\"SelectedItem\", DefaultValueExpression = \"new Data()\")]\n```\nIf your type is declared outside the namespace of an attribute declaration, \nyou will need to specify the full name of the type, including the namespace.\n\n### XML documentation\nThe easiest way to add documentation is the `Description` parameter.\nIt will add a `System.ComponentModel.Description` attribute to the property and will also be used in the xml documentation.  \nIf for some reason you need to save raw xml documentation for your properties, \nthere is an option to specify raw xml text for both DependencyProperty and getter/setter \nvia `XmlDocumentation`/`PropertyXmlDocumentation` attribute properties.\n\n### Platform detection\nFor some platforms there is no automatic detection. In these cases, the generator needs a little help by adding:\n```xml\n  \u003cPropertyGroup\u003e\n    \u003cDefineConstants\u003e$(DefineConstants);HAS_UNO\u003c/DefineConstants\u003e\n    \u003cDefineConstants\u003e$(DefineConstants);HAS_UNO_WINUI\u003c/DefineConstants\u003e\n    \u003cDefineConstants\u003e$(DefineConstants);HAS_AVALONIA\u003c/DefineConstants\u003e\n  \u003c/PropertyGroup\u003e\n```\nAutomatic detection of Uno [was added in Uno 4.5](https://github.com/unoplatform/uno/pull/9443).\n\n### Bind event\nThe generator can automatically control properties that depend on events:\n```cs\n[AttachedDependencyProperty\u003cobject, Grid\u003e(\"BindEventProperty\", BindEvent = nameof(Grid.MouseWheel))]\npublic static partial class GridExtensions\n{\n    private static void OnBindEventPropertyChanged_MouseWheel(object? sender, System.Windows.Input.MouseWheelEventArgs args)\n    {\n    }\n}\n```\nwill generate additional code:\n```cs\nstatic partial void OnBindEventPropertyChanged_BeforeBind(\n    global::System.Windows.Controls.Grid sender,\n    object? oldValue,\n    object? newValue);\nstatic partial void OnBindEventPropertyChanged_AfterBind(\n    global::System.Windows.Controls.Grid sender,\n    object? oldValue,\n    object? newValue);\n\nstatic partial void OnBindEventPropertyChanged(\n    global::System.Windows.Controls.Grid sender,\n    object? oldValue,\n    object? newValue)\n{\n    OnBindEventPropertyChanged_BeforeBind(\n        sender,\n        oldValue,\n        newValue);\n\n    if (oldValue is not default(object))\n    {\n        sender.MouseWheel -= OnBindEventPropertyChanged_MouseWheel;\n    }\n    if (newValue is not default(object))\n    {\n        sender.MouseWheel += OnBindEventPropertyChanged_MouseWheel;\n    }\n\n    OnBindEventPropertyChanged_AfterBind(\n        sender,\n        oldValue,\n        newValue);\n}\n```\n\n### Override metadata\nFor UWP/WinUI/Uno, a special `RegisterPropertyChangedCallbacks()` method will be created, \nwhich you will need to call in the constructor to register property change callbacks.\n\n## Notes\nTo use generic attributes, you need to set up `LangVersion` in your .csproj:\n```xml\n\u003cLangVersion\u003epreview\u003c/LangVersion\u003e\n```\nThere are also non-Generic attributes here.\n\n## Possible features\n- [Mutable default values in constructor](https://devblogs.microsoft.com/oldnewthing/20191003-00/?p=102959)\n\n## Support\nPriority place for bugs: https://github.com/HavenDV/DependencyPropertyGenerator/issues  \nPriority place for ideas and general questions: https://github.com/HavenDV/DependencyPropertyGenerator/discussions  \nI also have a Discord support channel:  \nhttps://discord.gg/g8u2t9dKgE\n","funding_links":["https://patreon.com/havendv","https://ko-fi.com/havendv","https://www.paypal.me/havendv","https://www.buymeacoffee.com/havendv","https://www.upwork.com/freelancers/~017b1ad6f6af9cc189"],"categories":["Contributors Welcome for those","Source Generators"],"sub_categories":["1. [ThisAssembly](https://ignatandrei.github.io/RSCG_Examples/v2/docs/ThisAssembly) , in the [EnhancementProject](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#enhancementproject) category","XAML / WPF / Avalonia"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHavenDV%2FDependencyPropertyGenerator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FHavenDV%2FDependencyPropertyGenerator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHavenDV%2FDependencyPropertyGenerator/lists"}