Bindables
Bindables converts your auto properties into Wpf dependency or attached properties.
Install / Use
/learn @notanaverageman/BindablesREADME
Roslyn source generator to create dependency and attached properties for WPF, Xamarin.Forms, and .NET MAUI
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.DependencyObjectorXamarin.Forms.BindableObjectorMicrosoft.Maui.Controls.BindableObjectaccording 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
node-connect
349.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
349.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
349.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
