Страница с параметром типа
Я хотел бы использовать новую функцию 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;
}
}
Как видите, этот класс BasePage содержит свойство с именем "VM", а свойство имеет тип BaseVM. Следовательно, мне не нужно определять свойство VM для каждого производного класса.
Затем я создал производную страницу MainPage, определенную в xaml следующим образом:
<pages:BasePage
x:Class="Realarm.View.Pages.MainPage"
x:TypeArguments="viewModel:MainVM">
Таким образом, даже Intellisense Решарпера предлагает мне свойства из "MainVM" в MainPage.xaml, поэтому он может написать:
<ListView ItemsSource="{x:Bind VM.AlarmsVM}">
К сожалению, когда я пытаюсь построить проект, я получаю сообщение об ошибке в MainPage.gics:
Код серьезности Описание Строка файла проекта Ошибка CS0305 Для использования универсального типа "BasePage" требуются аргументы 1 типа Realarm D:...\Realarm\obj\x86\Debug\View\Pages\MainPage.gics 13
Любая помощь?
1 ответ
Я получил это с помощью Xamarin.Forms.
Базовая страница:
public abstract class BaseContentPage<TViewModel> : ContentPage where TViewModel : BaseViewModel, new()
HomePage.cs:
public partial class HomePage : BaseContentPage<HomeViewModel>
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>
Просто добавьте определение a x:TypeArguments вверху XAML:
<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">
Сработало и для меня, когда я установил BindingContext, как указано ниже, в конструкторе базовой страницы:
public BasePage()
{
BindingContext = new TBaseVM();
}