2016-07-24 27 views
10

Chcę opracować prosty projekt z Xamarin.Form i MVVM. W moim rozwiązaniu (o nazwie XamarinPOC) mam (oprócz standardowych projektów Xamarin.Forms) jeden oddzielny projekt dla modelu (XamarinPOC.Model) i jeden osobny projekt dla ViewModel (XamarinPOC.ViewModel).Ustaw BindingContext na ViewModel w XAML na Xamarin.Forms

I zdefiniowane w projekcie XamarinPOC.ViewModel klasy abstrakcyjnej dla klasy BaseViewModel (która implementuje interfejs INotifyPropertyChanged) i po I utworzeniu klasy SummaryViewModel że rozszerzenia klasy BaseViewModel z prostym nieruchomości:

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(){} 
    } 
} 

Następnie utworzyłem prosty ContentPage (SummatyView) w projekcie XamarinPOC, który zawiera tylko etykietę, którą chcę pokazać tekst zdefiniowany w ViewModel. Chcę użyć XAML do zdefiniowania widoku i powiązania, ale gdy uruchomię aplikację nic nie jest wyświetlane, nie mam błędów podczas kompilacji i środowiska wykonawczego, ale tekst nie jest wyświetlany. Mój XAML jest to

<?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> 

i wreszcie moje app.cs jest:

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

W projekcie XamarinPOC Dodałem odniesienia do XamarinPOC.ViewModel oraz zespołów XamarinPOC.Model.

Myślę, że problem tkwi w definicji wiązania XAML, ale nie znajduję błędu. Gdzie się mylę?

+2

Musisz przypisać BindingContext instancję * Twojego ViewModel, nie definicja sama – Jason

Odpowiedz

13

Aby powiązać pogląd na viewmodel z Xaml w Twoim przypadku to zrobić jak ten

<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> 

One marginesie zauważyłem jest z konwencjami nazewnictwa, to lepiej, aby umieścić wszystkie swoje ViewModels, nawet jeśli jest to tylko jeden viewmodel, wewnątrz folderu o nazwie „ViewModel s” Więc nazw w przypadku byłoby XamarinPOC.ViewModel s

+0

klasa Dzięki za ans wer, próbowałem Twojego rozwiązania, ale aplikacja rzuciła wyjątek środowiska wykonawczego podczas próby rozwiązania przestrzeni nazw 'xmlns: local =" clr-namespace: XamarinPOC.ViewModel; assembly = XamarinPOC.ViewModel "' , ale twoje rozwiązanie idzie w dobrym kierunku, po innych poszukiwaniach znalazłem informację o poprawnej implementacji: 'xmlns: mvvm =" clr-namespace: XamarinPOC.ViewModel; assembly = XamarinPOC.ViewModel "jedyna różnica w twoim rozwiązaniu to prefiks xmlns, ponieważ użycie ** xmlns: local ** jest w tym przypadku błędne i muszę użyć innego prefiksu (wybieram ** xmlns: mvvm **) – fabiuz

+0

Świetny Naprawiłem to – BraveHeart