Xamarin Master Detail处理泛型

时间:2016-11-28 16:11:48

标签: c# generics xamarin xamarin.forms generic-list

我已阅读xamarin网站上的tutorial

但是我想创建一个能够处理泛型的Master。出于这个原因,我对MasterPageItem的实现有点不同

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; }
}

但是我在构建页面项列表时遇到问题

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

以及处理listview上的click事件的其他问题

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

有没有办法可以使用泛型来使用MasterDetail?

1 个答案:

答案 0 :(得分:3)

您可以通过同时使用TPageTViewModel协变(out修饰符)来更改界面:

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

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

然后你就可以这样做:

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

而且:

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