Xaml 带有类型参数的页面
我想使用UWP->x:Bind的新特性。为此,我的所有页面都需要具有ViewModel属性(如教程中所述)。 为了避免代码重复,我建立了如下基类: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
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你解决了这个问题吗?我遇到了同样的问题,我发现的一切都表明它应该可以工作,但我得到了与您相同的错误。不幸的是,没有。我对接口使用了不同的方法。但这并没有解决代码的双重性。