Страница с параметром типа

Я хотел бы использовать новую функцию 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();
    }
Другие вопросы по тегам