Xaml 带有类型参数的页面

Xaml 带有类型参数的页面,xaml,generics,mvvm,xbind,windows-10-universal,Xaml,Generics,Mvvm,Xbind,Windows 10 Universal,我想使用UWP->x:Bind的新特性。为此,我的所有页面都需要具有ViewModel属性(如教程中所述)。 为了避免代码重复,我建立了如下基类: public abstract class BasePage<TBaseVM> : Page, where TBaseVM : BaseVM { public TBaseVM VM { get; private set; } protected BasePage() { DataContextCh

我想使用UWP->x:Bind的新特性。为此,我的所有页面都需要具有ViewModel属性(如教程中所述)。 为了避免代码重复,我建立了如下基类:

public abstract class BasePage<TBaseVM> : Page, where TBaseVM : BaseVM
{
    public TBaseVM VM { get; private set; }

    protected BasePage()
    {
        DataContextChanged += (s, e) => VM = e.NewValue as TBaseVM;            
    }
}
<pages:BasePage
x:Class="Realarm.View.Pages.MainPage"
x:TypeArguments="viewModel:MainVM">
public抽象类BasePage:Page,其中TBaseVM:BaseVM
{
公共TBaseVM VM{get;private set;}
受保护的BasePage()
{
DataContextChanged+=(s,e)=>VM=e.NewValue作为TBaseVM;
}
}
正如您所看到的,这个BasePage类包含名为“VM”的属性,该属性的类型为BaseVM。因此,我不需要在每个派生类上定义VM属性

然后,我创建了在xaml中定义的派生页面“MainPage”,如下所示:

public abstract class BasePage<TBaseVM> : Page, where TBaseVM : BaseVM
{
    public TBaseVM VM { get; private set; }

    protected BasePage()
    {
        DataContextChanged += (s, e) => VM = e.NewValue as TBaseVM;            
    }
}
<pages:BasePage
x:Class="Realarm.View.Pages.MainPage"
x:TypeArguments="viewModel:MainVM">

通过这样做,即使是Resharper的Intellisense也可以从MainPage.xaml中的“MainVM”中为我提供属性,因此可以编写:

<ListView ItemsSource="{x:Bind VM.AlarmsVM}">

不幸的是,当我尝试构建项目时,在MainPage.g.I.cs中出现错误:

严重性代码说明项目文件行 错误CS0305使用泛型类型“BasePage”需要1个类型参数Realarm D:…\Realarm\obj\x86\Debug\View\Pages\MainPage.g.i.cs 13


有什么帮助吗?

我是通过Xamarin.Forms得到的

主页:

public abstract class BaseContentPage<TViewModel> : ContentPage where TViewModel : BaseViewModel, new()
公共抽象类BaseContentPage:ContentPage,其中TViewModel:BaseViewModel,new()
HomePage.cs:

public partial class HomePage : BaseContentPage<HomeViewModel>
公共部分类主页:BaseContentPage
HomePage.xaml:

<d:BaseContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="clr-namespace:Sample.Pages;assembly=Sample" xmlns:vm="clr-namespace:Sample.ViewModels;assembly=Sample" x:Class="Sample.Pages.HomePage" x:TypeArguments="vm:HomeViewModel">
<ContentPage.Content>
</ContentPage.Content>


当我在基本页的构造函数中设置BindingContext(如下所示)时,它也对我起到了作用:

    public BasePage()
    {
        BindingContext = new TBaseVM();
    }

只需在XAML的顶部添加一个x:TypeArguments定义:

<v:BasePage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:v="clr-namespace:YourApp.Views"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:d="http://xamarin.com/schemas/2014/forms/design"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:vm="clr-namespace:YourApp.ViewModels"
            mc:Ignorable="d"
            x:TypeArguments="vm:HomeViewModel"
            x:Class="YourApp.MainPage">


我觉得不错。可能是因为您的类被标记为
abstract
?你不能实例化一个抽象类,试着删除它。当然,我有我要实例化的派生类。你试过运行问题中的代码吗?@de_ViL你解决了这个问题吗?我遇到了同样的问题,我发现的一切都表明它应该可以工作,但我得到了与您相同的错误。不幸的是,没有。我对接口使用了不同的方法。但这并没有解决代码的双重性。