PropertyGenerator.Avalonia
1.3.1
dotnet add package PropertyGenerator.Avalonia --version 1.3.1
NuGet\Install-Package PropertyGenerator.Avalonia -Version 1.3.1
<PackageReference Include="PropertyGenerator.Avalonia" Version="1.3.1" />
<PackageVersion Include="PropertyGenerator.Avalonia" Version="1.3.1" />
<PackageReference Include="PropertyGenerator.Avalonia" />
paket add PropertyGenerator.Avalonia --version 1.3.1
#r "nuget: PropertyGenerator.Avalonia, 1.3.1"
#:package PropertyGenerator.Avalonia@1.3.1
#addin nuget:?package=PropertyGenerator.Avalonia&version=1.3.1
#tool nuget:?package=PropertyGenerator.Avalonia&version=1.3.1
PropertyGenerator.Avalonia
Auto generate StyledProperty, DirectProperty, and AttachedProperty for Avalonia applications
StyledProperty
[GeneratedStyledProperty]
public partial int Count { get; set; }
Generated code:
StyledProperty<int> CountProperty = AvaloniaProperty.Register<MainWindow, int>(name: nameof(Count));
public partial int Count { get => GetValue(CountProperty); set => SetValue(CountProperty, value); }
[GeneratedStyledProperty(10)]
public partial int Count { get; set; }
Generated code:
Avalonia.StyledProperty<int> CountProperty = AvaloniaProperty.Register<MainWindow, int>(name: nameof(Count), defaultValue: 10);
public partial int Count { get => GetValue(CountProperty); set => SetValue(CountProperty, value); }
[GeneratedStyledProperty(
DefaultValueCallback = nameof(DefaultValueCallback),
DefaultValue = true,
Validate = nameof(Validate),
Coerce = nameof(Coerce),
EnableDataValidation = true,
Inherits = true,
DefaultBindingMode = BindingMode.TwoWay)]
public partial bool? IsStarted { get; set; }
private static bool DefaultValueCallback()
{
return true;
}
private static bool Validate(bool? value)
{
return true;
}
private static bool? Coerce(AvaloniaObject x, bool? y)
{
return true;
}
Generated code:
StyledProperty<bool?> IsStartedProperty = AvaloniaProperty.Register<MainWindow, bool?>(
name: nameof(IsStarted),
defaultValue: DefaultValueCallback(),
validate: Validate,
coerce: Coerce,
enableDataValidation: true,
inherits: true,
defaultBindingMode:BindingMode.TwoWay);
public partial bool? IsStarted { get => GetValue(IsStartedProperty); set => SetValue(IsStartedProperty, value); }
DirectProperty
Similar in usage to StyledProperty generator
[GeneratedDirectProperty]
public partial IEnumerable? Items { get; set; }
You can directly initialize DirectProperty
[GeneratedDirectProperty]
public partial IEnumerable? Items { get; set; } = new AvaloniaList<object>();
You can also customize Getter and Setter for DirectProperty
[GeneratedDirectProperty(Getter = nameof(Getter), Setter = nameof(Setter))]
public partial IEnumerable? Items { get; set; }
public static IEnumerable? Getter(MainWindow o) => o.Items;
public static void Setter(MainWindow o, IEnumerable? v) => o.Items = v;
Generated code:
public static readonly DirectProperty<MainWindow, IEnumerable?> ItemsProperty
= AvaloniaProperty.RegisterDirect<MainWindow, IEnumerable?>(
name: nameof(Items),
getter: Getter,
setter: Setter);
public partial IEnumerable? Items { get => field; set => SetAndRaise(ItemsProperty, ref field, value); }
Attached Property
Define attached properties on a partial class by using GenerateAttachedProperty<THost, TValue>:
[GenerateAttachedProperty<Control, string>("Tag")]
public partial class MainWindow : AvaloniaObject
{
}
Generated code:
public static readonly AttachedProperty<string> TagProperty = RegisterTagProperty();
public static string GetTag(Control host) => host.GetValue(TagProperty);
public static void SetTag(Control host, string value) => host.SetValue(TagProperty, value);
You can configure default value and registration options:
[GenerateAttachedProperty<Control, bool>("IsBusy",
DefaultValueCallback = nameof(GetDefaultIsBusy),
Validate = nameof(ValidateIsBusy),
Coerce = nameof(CoerceIsBusy),
Inherits = true,
DefaultBindingMode = BindingMode.TwoWay)]
public partial class MainWindow : AvaloniaObject
{
private static bool GetDefaultIsBusy() => true;
private static bool ValidateIsBusy(bool value) => value;
private static bool CoerceIsBusy(Control host, bool value) => value;
}
By default, attached property generation also emits these static partial callbacks:
static partial void OnIsBusyPropertyChanged(Control host, AvaloniaPropertyChangedEventArgs e);
static partial void OnIsBusyPropertyChanged(Control host, bool newValue);
static partial void OnIsBusyPropertyChanged(Control host, bool oldValue, bool newValue);
Apply DoNotGenerateOnPropertyChangedAttribute to disable those callbacks.
OnPropertyChanged
By default, the generator will override OnPropertyChanged and generate property changed methods at the same time:
partial void OnCountPropertyChanged(int newValue);
partial void OnCountPropertyChanged(int oldValue, int newValue);
partial void OnCountPropertyChanged(AvaloniaPropertyChangedEventArgs e);
partial void OnPropertyChangedOverride(AvaloniaPropertyChangedEventArgs change);
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);
switch (change.Property.Name)
{
case nameof(Count):
OnCountPropertyChanged(change);
OnCountPropertyChanged((int)change.NewValue);
OnCountPropertyChanged((int)change.OldValue, (int)change.NewValue);
break;
}
OnPropertyChangedOverride(change);
}
You can still handle all property changes by using OnPropertyChangedOverride method.
To generate property changed methods for properties in base class, you can use GenerateOnPropertyChangedAttribute on target class:
[GenerateOnPropertyChanged(nameof(Height))]
public partial class MainWindow : Window
{ ... }
To disable this feature, use DoNotGenerateOnPropertyChangedAttribute for class or assembly:
[DoNotGenerateOnPropertyChanged]
public partial class MainWindow : Window
{ ... }
[assembly: DoNotGenerateOnPropertyChanged]
Diagnostics
| Rule ID | Severity | Area | Notes |
|---|---|---|---|
| PGA1001 | Error | Styled/Direct | invalid property declaration shape for generated property. |
| PGA1002 | Error | Styled/Direct | containing type must inherit AvaloniaObject. |
| PGA1003 | Error | Styled/Direct | callback method not found. |
| PGA1004 | Error | Styled/Direct | callback method signature invalid. |
| PGA1005 | Error | Direct | invalid direct getter/setter method reference. |
| PGA1006 | Error | Attached | invalid attached property name. |
| PGA1007 | Error | All generators | containing type must be partial. |
| PGA1008 | Warning | Attached | duplicate attached property name on owner. |
| PGA1009 | Warning | OnPropertyChanged | GenerateOnPropertyChanged target property not found. |
| PGA1010 | Warning | OnPropertyChanged | GenerateOnPropertyChanged disabled. |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Avalonia (>= 11.3.0)
- Microsoft.CodeAnalysis.CSharp (>= 4.14.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.