SkillAgentSearch skills...

Bindables

Bindables converts your auto properties into Wpf dependency or attached properties.

Install / Use

/learn @notanaverageman/Bindables
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Roslyn source generator to create dependency and attached properties for WPF, Xamarin.Forms, and .NET MAUI

NuGet Bindables.Wpf NuGet Bindables.Forms NuGet Bindables.Forms AppVeyor

Requirements

  • Your class should be partial.
  • If you create a dependency property (WPF) or bindable property (Xamarin.Forms & .NET MAUI), your class should inherit from System.Windows.DependencyObject or Xamarin.Forms.BindableObject or Microsoft.Maui.Controls.BindableObject according to the project type. Attached properties don't have this requirement.
  • Bindables creates the static constructor for the class to initialize the dependency properties. If you have custom static constructor for a type, you can't use Bindables on it.

Example (WPF)

Check Types for Frameworks for other frameworks.

Your Code

using System.Windows;
using Bindables.Wpf;

public partial class YourClass : DependencyObject
{
    private static readonly string DefaultValue = "Test";

    [DependencyProperty(typeof(string))]
    public static readonly DependencyProperty RegularProperty;

    // You can use any visibility modifier.
    [DependencyProperty(typeof(string))]
    private static readonly DependencyPropertyKey ReadOnlyPropertyKey;

    [DependencyProperty(typeof(string), OnPropertyChanged = nameof(PropertyChangedCallback), DefaultValueField = nameof(DefaultValue), Options = FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)]
    public static readonly DependencyProperty CustomizedProperty;

    private static void PropertyChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
    }
}

Generated Code

// Generated by Bindables
using System.Windows;

#nullable enable

public partial class YourClass
{
    [global::System.CodeDom.Compiler.GeneratedCode("Bindables.Wpf.WpfPropertyGenerator", "1.4.1")]
    public string? Regular
    {
        get => (string?)GetValue(RegularProperty);
        set => SetValue(RegularProperty, value);
    }

    [global::System.CodeDom.Compiler.GeneratedCode("Bindables.Wpf.WpfPropertyGenerator", "1.4.1")]
    public static readonly DependencyProperty ReadOnlyProperty;

    [global::System.CodeDom.Compiler.GeneratedCode("Bindables.Wpf.WpfPropertyGenerator", "1.4.1")]
    public string? ReadOnly
    {
        get => (string?)GetValue(ReadOnlyProperty);
        private set => SetValue(ReadOnlyPropertyKey, value);
    }

    [global::System.CodeDom.Compiler.GeneratedCode("Bindables.Wpf.WpfPropertyGenerator", "1.4.1")]
    public string? Customized
    {
        get => (string?)GetValue(CustomizedProperty);
        set => SetValue(CustomizedProperty, value);
    }

    [global::System.CodeDom.Compiler.GeneratedCode("Bindables.Wpf.WpfPropertyGenerator", "1.4.1")]
    static YourClass()
    {
        RegularProperty = DependencyProperty.Register(
            nameof(Regular),
            typeof(string),
            typeof(YourClass),
            new FrameworkPropertyMetadata());

        ReadOnlyPropertyKey = DependencyProperty.RegisterReadOnly(
            nameof(ReadOnly),
            typeof(string),
            typeof(YourClass),
            new FrameworkPropertyMetadata());

        ReadOnlyProperty = ReadOnlyPropertyKey.DependencyProperty;

        CustomizedProperty = DependencyProperty.Register(
            nameof(Customized),
            typeof(string),
            typeof(YourClass),
            new FrameworkPropertyMetadata(DefaultValue, (FrameworkPropertyMetadataOptions)256, PropertyChangedCallback));
    }
}

Options

You can pass following options:

|Option | Description | |-----------------------------|-----------------------------------------------------------------------------------| |OnPropertyChanged | Name of the method that will be called when the property is changed. | |OnCoerceValue (WPF) | Name of the method that will be called when the property is re-evaluated/coerced. | |DefaultValueField | Name of the static field that will provide the default value for the property. | |Options (WPF) | Pass System.Windows.FrameworkPropertyMetadataOptions to the dependency property.| |BindingMode (Xamarin.Forms)| Pass Xamarin.Forms.BindingMode to the dependency property. | |BindingMode (.NET MAUI) | Pass Microsoft.Maui.Controls.BindingMode to the dependency property. |

Signature of OnPropertyChanged method should be: |Project Type |Signature | |-------------------------|---------------------------------------------------------------------------------------| |WPF |static void MethodName(DependencyObject obj, DependencyPropertyChangedEventArgs args)| |Xamarin.Forms & .NET MAUI|static void MethodName(BindableObject obj, object oldValue, object newValue) |

Signature of OnCoerceValue method should be: |Project Type |Signature | |-------------------------|--------------------------------------------------------------| |WPF |static object MethodName(DependencyObject obj, object value)| |Xamarin.Forms & .NET MAUI|static object MethodName(BindableObject obj, object value) |

Types for Frameworks

|Project Type |Dependency Property Type|Access Type|Property Suffix|Field Type |Attribute Type | |-------------|------------------------|-----------|---------------|-----------------------|-------------------------------------------| |WPF |Dependency Property |Read/Write |Property |DependencyProperty |Bindables.Wpf.DependencyPropertyAttribute| |WPF |Dependency Property |Read Only |PropertyKey |DependencyPropertyKey|Bindables.Wpf.DependencyPropertyAttribute| |WPF |Attached Property |Read/Write |Property |DependencyProperty |Bindables.Wpf.AttachedPropertyAttribute | |WPF |Attached Property |Read Only |PropertyKey |DependencyPropertyKey|Bindables.Wpf.AttachedPropertyAttribute | |Xamarin.Forms|Bindable Property |Read/Write |Property |BindableProperty |Bindables.Forms.BindablePropertyAttribute| |Xamarin.Forms|Bindable Property |Read Only |PropertyKey |BindablePropertyKey |Bindables.Forms.BindablePropertyAttribute| |Xamarin.Forms|Attached Property |Read/Write |Property |BindableProperty |Bindables.Forms.AttachedPropertyAttribute| |Xamarin.Forms|Attached Property |Read Only |PropertyKey |BindablePropertyKey |Bindables.Forms.AttachedPropertyAttribute| |.NET MAUI |Bindable Property |Read/Write |Property |BindableProperty |Bindables.Maui.BindablePropertyAttribute | |.NET MAUI |Bindable Property |Read Only |PropertyKey |BindablePropertyKey |Bindables.Maui.BindablePropertyAttribute | |.NET MAUI |Attached Property |Read/Write |Property |BindableProperty |Bindables.Maui.AttachedPropertyAttribute | |.NET MAUI |Attached Property |Read Only |PropertyKey |BindablePropertyKey |Bindables.Maui.AttachedPropertyAttribute |

Related Skills

View on GitHub
GitHub Stars52
CategoryDevelopment
Updated1mo ago
Forks9

Languages

C#

Security Score

100/100

Audited on Feb 20, 2026

No findings