Roslyn source generator to create dependency and attached properties for WPF, Xamarin.Forms, and .NET MAUI
- 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.
Check Types for Frameworks for other frameworks.
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 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));
}
}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) |
| 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 |