A method I have found to be particularly effective at passing objects and even large lists (though I suspect it is by reference rather than by value) around pages is to use the MessagingCenter system. I use it to also indicate that something has happened in one part and needs to be handled in another part e.g. between code behind and ViewModel (not everything is bound!)
In sender code (String.Empty can be any object)
MessagingCenter.Send(new EmptyClass(), "SomethingHappened", String.Empty);
In receiving code (in constructor works well)
MessagingCenter.Subscribe<EmptyClass, string>(this, "SomethingHappened", (sender, arg) =>
{
//arg contains the object (in this case a string);
});
this can be any object apparently!
EmptyClass is just that
namespace xxx
public class EmptyClass
{
}
There are some questions I asked in Stackoverflow such as https://stackoverflow.com/questions/73005923/messagingcentre-does-it-pass-object-by-value-or-by-reference
Hope this provides a solution to your issue :)