2015-11-14 4 views
2

Я хотел бы использовать новую функцию 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 ReSharper предлагает мне свойства от «MainVM» в MainPage.xaml, таким образом, можно записать:

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

к сожалению, когда я пытаюсь построить проект, я получаю сообщение об ошибке в MainPage.gics:

S everity Код Описание проекта File Line CS0305 Ошибка Использование универсального типа 'BasePage' требует 1 аргументы типа Realarm D: ... \ Realarm \ OBJ \ x86 \ Debug \ View \ Pages \ MainPage.gics 13

Любая помощь?

+0

Выглядит хорошо для меня. Возможно, это потому, что ваш класс отмечен как «абстрактный»? Вы не можете создать экземпляр абстрактного класса, попробуйте удалить его. –

+0

Конечно, у меня есть классы, которые я пытаюсь создать. Вы пытались запустить код из вопроса? –

+0

@de_ViL Вы решили это? У меня такая же проблема, и все, что я нахожу, говорит, что она должна работать, но я получаю ту же ошибку, что и вы. – thorkia

ответ

0

Я получил эту работу, используя 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> 

Смежные вопросы