Lorenzo
Lorenzo

Reputation: 29427

Xamarin Master Detail handle generics

I have read the tutorial on the xamarin web site.

However I would like to create a Master which is able to handle generics. For this reason my implementation of MasterPageItem is a little bit different

public interface IMasterPageItem<TPage, TViewModel>
    where TPage : Xamarin.Forms.ContentPage
    where TViewModel : ViewModel.BaseViewModel
{
        TPage Page { get; }

        TViewModel ViewModel { get; }
}


public class MasterPageItem<TPage, TViewModel> : IMasterPageItem<TPage, TViewModel>
    where TPage : Xamarin.Forms.ContentPage
    where TViewModel : ViewModel.BaseViewModel
{
    public TPage Page { get; set; }

    public TViewModel ViewModel { get; set; }
}

However I am having problems to build the List of page items

var masterPageItems = new List<IMasterPageItem<?,?>>();
masterPageItems.Add( new MasterPageItem<HomePage, HomePageViewModel>() );

as well as other problems to handle the click event on the listview

public void ListView_ItemSelected( object sender, ItemTappedEventArgs e ) {
    var item = e.Item as IMasterPageItem<?,?>;
    [...]
}

Is there any way I can use MasterDetail by using generics?

Upvotes: 1

Views: 55

Answers (1)

Evk
Evk

Reputation: 101543

You can change your interface a bit, by making both TPage and TViewModel covariant (out modifier):

public interface IMasterPageItem<out TPage, out TViewModel>
    where TPage : Xamarin.Forms.ContentPage
    where TViewModel : BaseViewModel {

    TPage Page { get; }
    TViewModel ViewModel { get; }
}

Then you are able to do this:

var masterPageItems = new List<IMasterPageItem<Xamarin.Forms.ContentPage, BaseViewModel>>();
masterPageItems.Add(new MasterPageItem<HomePage, HomePageViewModel>());

And this:

var item = e.Item as IMasterPageItem<Xamarin.Forms.ContentPage, BaseViewModel>;

Upvotes: 3

Related Questions