Xamarin Master Detail 句柄泛型

Xamarin Master Detail handle generics

我已阅读 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>() );

以及处理列表视图上的点击事件的其他问题

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

有什么方法可以通过使用泛型来使用 MasterDetail 吗?

您可以通过使 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>;