web-dev-qa-db-fra.com

Définissez BindingContext sur ViewModel en XAML sur Xamarin.Forms

Je souhaite développer un projet simple avec Xamarin.Form et MVVM. Dans ma solution (nommée XamarinPOC), j'ai (en plus des projets Xamarin.Forms standard) un projet distinct pour le modèle (XamarinPOC.Model) et un projet distinct pour ViewModel (XamarinPOC.ViewModel).

J'ai défini dans un projet XamarinPOC.ViewModel une classe abstraite pour une classe BaseViewModel (qui implémente l'interface INotifyPropertyChanged) et après avoir créé une classe SummaryViewModel qui étend la classe BaseViewModel avec une propriété simple:

namespace XamarinPOC.ViewModel
{
    public class SummaryViewModel : BaseViewModel
    {

        private string _test = "The binding is OK!";
        public String test
        {
            get
            {
                return _test;
            }
            set
            {
                _test = value;
                OnPropertyChanged("test");
            }
        }
        public SummaryViewModel(){}
    }
}

Ensuite, j'ai créé un ContentPage simple (SummatyView) dans un projet XamarinPOC qui contient uniquement une étiquette que je veux afficher le texte défini dans ViewModel. Je veux utiliser un XAML pour définir la vue et la liaison, mais lorsque j'exécute l'application, rien ne s'affiche, je n'ai aucune erreur au moment de la compilation et de l'exécution, mais le texte ne s'affiche pas. Mon XAML est le suivant

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XamarinPOC.ViewModel,Assembly=XamarinPOC.ViewModel"
             x:Class="XamarinPOC.Summary"
             Title="Summary List"
             BindingContext="XamarinPOC.ViewModel.SummaryViewModel">
  <StackLayout>
    <Label Text="{Binding test}"/>
  </StackLayout>
</ContentPage>

et enfin mon app.cs est:

 namespace XamarinPOC
{
     public class App : Application
     {
         public App()
         {
             MainPage = new Summary();
         }
     }
 }

Dans le projet XamarinPOC, j'ai ajouté une référence aux assemblys XamarinPOC.ViewModel et XamarinPOC.Model.

Je pense que le problème est dans la définition XAML de la liaison, mais je ne trouve pas l'erreur. Où ai-je tort?

18
fabiuz

Pour lier la vue au viewmodel de Xaml dans votre cas, faites-le comme ceci

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             xmlns:viewModels="clr-namespace:XamarinPOC.ViewModel; Assembly=XamarinPOC.ViewModel"
             x:Class="XamarinPOC.Summary"
             Title="Summary List">
  <ContentPage.BindingContext>
    <viewModels:SummaryViewModel/>
  </ContentPage.BindingContext>
  <StackLayout>
    <Label Text="{Binding test}"/>
  </StackLayout>
</ContentPage>

Une note latérale que j'ai remarquée concerne les conventions de dénomination, il est préférable de mettre tous vos ViewModels, même s'il ne s'agit que d'un seul viewModel, dans un dossier nommé "ViewModel s". Ainsi, l'espace de noms dans votre cas serait XamarinPOC.ViewModel s

34
Ahmad ElMadi