Awesome
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.DependencyObject
orXamarin.Forms.BindableObject
orMicrosoft.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 |