Amend Navigation

This commit is contained in:
Daniel Clark
2022-12-22 20:31:25 +00:00
parent 757349285a
commit 894bbbd177
11 changed files with 424 additions and 151 deletions
+42 -77
View File
@@ -2,6 +2,7 @@
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Markup.Xaml;
using System.Xml.Linq;
using Toolkit.Framework.Foundation;
namespace Toolkit.Framework.Avalonia;
@@ -13,55 +14,50 @@ public class NavigateExtension : TriggerExtension
private static readonly AttachedProperty<object> ParameterProperty =
AvaloniaProperty.RegisterAttached<NavigateExtension, Control, object>("Parameter");
private static readonly AvaloniaProperty RouteProperty =
AvaloniaProperty.RegisterAttached<NavigateExtension, Control, object>("Route");
private static readonly AvaloniaProperty ToProperty =
AvaloniaProperty.RegisterAttached<NavigateExtension, Control, object>("To");
private static readonly AvaloniaProperty PathProperty =
AvaloniaProperty.RegisterAttached<NavigateExtension, Control, string>("Path");
private readonly Binding? mediatorBinding;
private readonly List<object?> parameters = new();
private readonly Binding? toBinding;
private object? route;
private Binding? routeBinding;
private readonly Binding? pathBinding;
public NavigateExtension(object mediator,
object to)
object path)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
}
public NavigateExtension(object mediator,
object to,
object path,
object args1)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -69,14 +65,14 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
object args4)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -85,7 +81,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -93,7 +89,7 @@ public class NavigateExtension : TriggerExtension
object args5)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -103,7 +99,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -112,7 +108,7 @@ public class NavigateExtension : TriggerExtension
object args6)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -123,7 +119,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -133,7 +129,7 @@ public class NavigateExtension : TriggerExtension
object args7)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -145,7 +141,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -156,7 +152,7 @@ public class NavigateExtension : TriggerExtension
object args8)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -169,7 +165,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -181,7 +177,7 @@ public class NavigateExtension : TriggerExtension
object args9)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -195,7 +191,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -208,7 +204,7 @@ public class NavigateExtension : TriggerExtension
object args10)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -223,7 +219,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -237,7 +233,7 @@ public class NavigateExtension : TriggerExtension
object args11)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -253,7 +249,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -268,7 +264,7 @@ public class NavigateExtension : TriggerExtension
object args12)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -285,7 +281,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -301,7 +297,7 @@ public class NavigateExtension : TriggerExtension
object args13)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -319,7 +315,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -336,7 +332,7 @@ public class NavigateExtension : TriggerExtension
object args14)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -355,7 +351,7 @@ public class NavigateExtension : TriggerExtension
}
public NavigateExtension(object mediator,
object to,
object path,
object args1,
object args2,
object args3,
@@ -373,7 +369,7 @@ public class NavigateExtension : TriggerExtension
object args15)
{
mediatorBinding = mediator.ToBinding();
this.toBinding = to is Binding toBinding ? toBinding : to.ToBinding();
this.pathBinding = path is Binding pathBinding ? pathBinding : path.ToBinding();
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
@@ -392,22 +388,6 @@ public class NavigateExtension : TriggerExtension
parameters.Add(args15 is MarkupExtension ? args15 : args15.ToBinding());
}
public object? Route
{
get
{
return route;
}
set
{
route = value;
if (route is not null)
{
routeBinding = route.ToBinding();
}
}
}
protected override void OnInvoked(object sender, EventArgs args)
{
if (TargetObject is not null && mediatorBinding is not null)
@@ -415,10 +395,10 @@ public class NavigateExtension : TriggerExtension
TargetObject.Bind(MediatorProperty, mediatorBinding);
if (TargetObject.GetValue(MediatorProperty) is IMediator mediator)
{
if (toBinding is not null)
if (pathBinding is not null)
{
TargetObject.Bind(ToProperty, toBinding);
if (TargetObject.GetValue(ToProperty) is { } to)
TargetObject.Bind(PathProperty, pathBinding);
if (TargetObject.GetValue(PathProperty) is string path)
{
List<object>? parameters = new();
foreach (object? parameter in this.parameters)
@@ -449,27 +429,12 @@ public class NavigateExtension : TriggerExtension
}
}
object? route = null;
if (routeBinding is not null)
if (pathBinding?.StringFormat is string format)
{
TargetObject.Bind(RouteProperty, routeBinding);
route = TargetObject.GetValue(RouteProperty);
path = string.Format(format, path);
}
if (to is string name)
{
if (toBinding?.StringFormat is string format)
{
name = string.Format(format, name);
}
mediator.Send(new Navigate(name, parameters.ToArray()) { Route = route });
}
if (to is Type type)
{
mediator.Send(new Navigate(type, parameters.ToArray()) { Route = route });
}
mediator.Send(new Navigate(path, parameters.ToArray()));
}
}
}