Skip to content

Commit

Permalink
added support for the NavigateTo extension to work within EventToCommand
Browse files Browse the repository at this point in the history
  • Loading branch information
brianlagunas committed Jun 24, 2021
1 parent 15140a6 commit e40652d
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/Forms/Prism.Forms/Xaml/ParentPageAwareExtension.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Prism.Behaviors;
using Prism.Properties;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
Expand Down Expand Up @@ -85,6 +86,10 @@ private void Initialize()

_targetElement = valueTargetProvider.TargetObject as Element;

//this is handling the scenario of the extension being used within the EventToCommandBehavior
if (_targetElement is null && valueTargetProvider.TargetObject is BehaviorBase<BindableObject> behavior)
_targetElement = behavior.AssociatedObject as Element;

if (_targetElement is null)
throw new ArgumentNullException(nameof(TargetElement));

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Threading.Tasks;
using System.Windows.Input;
using Prism.Behaviors;
using Prism.DI.Forms.Tests.Fixtures;
using Prism.DI.Forms.Tests.Mocks.Internals;
using Prism.DI.Forms.Tests.Mocks.Views;
Expand Down Expand Up @@ -166,5 +167,50 @@ public void UsesMasterDetailPage_WhenParentIsMaster()
Assert.NotNull(navigateExtension.SourcePage);
Assert.IsType<MasterDetailPage>(navigateExtension.SourcePage);
}


[Fact]
public async Task ResolvesParentElementFrom_EventToCommandBehavior()
{
var app = CreateMockApplication();

Log.Listeners.Clear();
var logObserver = new FormsLogObserver();
Log.Listeners.Add(logObserver);

var behavior = new EventToCommandBehavior() { EventName = "ItemTapped" };
var layout = new ListView();
layout.Behaviors.Add(behavior);

var serviceProvider = new XamlServiceProvider();
serviceProvider.Add(typeof(IProvideValueTarget), new XamlValueTargetProvider(behavior, "Command"));

var navigateExtension = new NavigateToExtension()
{
Name = "/AutowireView"
};
navigateExtension.ProvideValue(serviceProvider);

app.MainPage = new NavigationPage(new ContentPage
{
Content = layout
});

Assert.NotNull(layout.Parent);
Assert.IsType<ContentPage>(layout.Parent);

Assert.NotNull(navigateExtension.SourcePage);
Assert.True(navigateExtension.CanExecute(null));
var ex = await Record.ExceptionAsync(async () =>
{
navigateExtension.Execute(null);
if (navigateExtension.IsNavigating)
await Task.Delay(100);
});
Assert.Null(ex);
Assert.Empty(logObserver.Logs);

Assert.IsType<AutowireView>(app.MainPage);
}
}
}

0 comments on commit e40652d

Please sign in to comment.