Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 21 additions & 17 deletions Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
// registered with Avalonia's property system; plain CLR properties resolve elsewhere.
// The PropertyChanged event only reports values after they change, so beforeChanged
// requests are declined and resolve elsewhere.
public int GetAffinityForObject(Type type, string propertyName, bool beforeChanged) =>

Check warning on line 28 in Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs

View workflow job for this annotation

GitHub Actions / Core (build + test)

Nullability of reference types in type of parameter 'type' of 'int AvaloniaObjectObservableForProperty.GetAffinityForObject(Type type, string propertyName, bool beforeChanged)' doesn't match implicitly implemented member 'int ICreatesObservableForProperty.GetAffinityForObject(Type? type, string propertyName, bool beforeChanged)' (possibly because of nullability attributes).

Check warning on line 28 in Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs

View workflow job for this annotation

GitHub Actions / Core (build + test)

Nullability of reference types in type of parameter 'type' of 'int AvaloniaObjectObservableForProperty.GetAffinityForObject(Type type, string propertyName, bool beforeChanged)' doesn't match implicitly implemented member 'int ICreatesObservableForProperty.GetAffinityForObject(Type? type, string propertyName, bool beforeChanged)' (possibly because of nullability attributes).
!beforeChanged &&
typeof(AvaloniaObject).IsAssignableFrom(type) &&
AvaloniaPropertyRegistry.Instance.FindRegistered(type, propertyName) is not null
Expand All @@ -38,33 +38,37 @@
public IObservable<IObservedChange<object?, object?>> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged) =>
GetNotificationForProperty(sender, expression, propertyName, beforeChanged, suppressWarnings: false);

public IObservable<IObservedChange<object?, object?>> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings)
{
if (beforeChanged)
public IObservable<IObservedChange<object?, object?>> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings)
{
return Observable.Never<IObservedChange<object?, object?>>();
}
// GetAffinityForObject already declines beforeChanged requests, so this is
// defensive: the PropertyChanged event cannot report values before they change.
if (beforeChanged)
{
return Observable.Never<IObservedChange<object?, object?>>();
}

if (sender is not AvaloniaObject avaloniaObject)
{
throw new ArgumentException($"Sender must be an AvaloniaObject, but was {sender?.GetType().FullName ?? \"null\"}.", nameof(sender));
}
if (sender is not AvaloniaObject avaloniaObject)
{
throw new ArgumentException($"Sender must be an AvaloniaObject, but was {sender?.GetType().FullName ?? "null"}.", nameof(sender));
}

var property = AvaloniaPropertyRegistry.Instance.FindRegistered(sender.GetType(), propertyName);
var property = AvaloniaPropertyRegistry.Instance.FindRegistered(sender.GetType(), propertyName);

if (property is null)
{
if (suppressWarnings)
if (property is null)
{
return Observable.Never<IObservedChange<object?, object?>>();
if (suppressWarnings)
{
return Observable.Never<IObservedChange<object?, object?>>();
}

throw new ArgumentException($"No AvaloniaProperty named '{propertyName}' is registered on {sender.GetType().FullName}.", nameof(propertyName));
}

throw new ArgumentException($"No AvaloniaProperty named '{propertyName}' is registered on {sender.GetType().FullName}.", nameof(propertyName));
}
return Observable.Create<IObservedChange<object?, object?>>(
observer =>
{
void Handler(object? _, AvaloniaPropertyChangedEventArgs args)
void Handler(object? handlerSender, AvaloniaPropertyChangedEventArgs args)
{
if (args.Property == property)
{
observer.OnNext(new ObservedChange<object?, object?>(sender, expression, default));
Expand Down
35 changes: 19 additions & 16 deletions Stellar.Uno/DependencyObjectObservableForProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
// below the IReactiveObject and INPC handlers, which serve those objects better.
// DependencyProperty callbacks cannot observe values before they change, so
// beforeChanged requests are declined and resolve elsewhere.
public int GetAffinityForObject(Type type, string propertyName, bool beforeChanged)

Check warning on line 25 in Stellar.Uno/DependencyObjectObservableForProperty.cs

View workflow job for this annotation

GitHub Actions / Core (build + test)

Nullability of reference types in type of parameter 'type' of 'int DependencyObjectObservableForProperty.GetAffinityForObject(Type type, string propertyName, bool beforeChanged)' doesn't match implicitly implemented member 'int ICreatesObservableForProperty.GetAffinityForObject(Type? type, string propertyName, bool beforeChanged)' (possibly because of nullability attributes).

Check warning on line 25 in Stellar.Uno/DependencyObjectObservableForProperty.cs

View workflow job for this annotation

GitHub Actions / Core (build + test)

Nullability of reference types in type of parameter 'type' of 'int DependencyObjectObservableForProperty.GetAffinityForObject(Type type, string propertyName, bool beforeChanged)' doesn't match implicitly implemented member 'int ICreatesObservableForProperty.GetAffinityForObject(Type? type, string propertyName, bool beforeChanged)' (possibly because of nullability attributes).
{
if (beforeChanged || !typeof(DependencyObject).IsAssignableFrom(type))
{
Expand All @@ -38,29 +38,32 @@
public IObservable<IObservedChange<object?, object?>> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged) =>
GetNotificationForProperty(sender, expression, propertyName, beforeChanged, suppressWarnings: false);

public IObservable<IObservedChange<object?, object?>> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings)
{
if (beforeChanged)
public IObservable<IObservedChange<object?, object?>> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings)
{
return Observable.Never<IObservedChange<object?, object?>>();
}
// GetAffinityForObject already declines beforeChanged requests, so this is
// defensive: DependencyProperty callbacks fire only after a value changes.
if (beforeChanged)
{
return Observable.Never<IObservedChange<object?, object?>>();
}

if (sender is not DependencyObject dependencyObject)
{
throw new ArgumentException($"Sender must be a DependencyObject, but was {sender?.GetType().FullName ?? \"null\"}.", nameof(sender));
}
if (sender is not DependencyObject dependencyObject)
{
throw new ArgumentException($"Sender must be a DependencyObject, but was {sender?.GetType().FullName ?? "null"}.", nameof(sender));
}

var dependencyProperty = GetDependencyProperty(sender.GetType(), propertyName);
var dependencyProperty = GetDependencyProperty(sender.GetType(), propertyName);

if (dependencyProperty is null)
{
if (suppressWarnings)
if (dependencyProperty is null)
{
return Observable.Never<IObservedChange<object?, object?>>();
if (suppressWarnings)
{
return Observable.Never<IObservedChange<object?, object?>>();
}

throw new ArgumentException($"No DependencyProperty named '{propertyName}Property' was found on {sender.GetType().FullName}.", nameof(propertyName));
}

throw new ArgumentException($"No DependencyProperty named '{propertyName}Property' was found on {sender.GetType().FullName}.", nameof(propertyName));
}
return Observable.Create<IObservedChange<object?, object?>>(
observer =>
{
Expand Down
Loading