Search code examples
xamarinxamarin.formsmaster-pages

Xamarin Forms - Adding constructor to MasterDetailPage.Master


I have a Xamarin.Forms app with a master-detail page and it works well.

But I've recently needed to add a parameter to the constructor of the master page (AttendPageMaster), but now I need to pass this constructor.

How do I add a parameter to the xaml?

<MasterDetailPage.Master>
    <pages:AttendPageMaster x:Name="MasterPage" />
</MasterDetailPage.Master>

The code behind page with constructor:

public AttendPageMaster(AttendanceViewModel viewModel)
{
}

Let me know if you need any more info.


Solution

  • You do not have to pass ViewModel to Page via constructor, you can set the Page's BindingContext:

    <MasterDetailPage.Master>
        <pages:AttendPageMaster x:Name="MasterPage">
            <pages:AttendPageMaster.BindingContext>
                <myViewModels:AttendanceViewModel />
            </pages:AttendPageMaster.BindingContext>
        </pages:AttendPageMaster>
    </MasterDetailPage.Master>
    

    This solution will work if your ViewModel does not expect any parameters in constructor. Otherwise you may consider using ViewModelLocator and DI to inject the constructor parameters.
    Please note that myViewModels should be defined in the header of your XAML page as xmlns:myViewModels.

    P.S.: Previously you mentioned that you got an exception while trying to use code behind approach. You could easily solve it by setting the Title property of the AttendPageMaster. Example:

    new AttendPageMaster(new AttendanceViewModel()){ Title = " " };