2010-09-07 12 views
11

Szukam próbki, która demonstruje w najlżejszy z możliwych sposobów:Niezwykle prosta próbka WP7 MVVM-Light?

Model, który wywołuje usługę sieciową opartą na protokole SOAP; regularne pobieranie w celu uzyskania najnowszej wartości (zakładamy, że usługa SOAP zwraca wartość boolowską). Model powinien również wspierać wywoływanie metody SOAP, która zmienia wartość logiczną na serwerze.

Model ViewModel umożliwiający powiązanie logiki bazowej z elementami sterującymi w widoku (np. Do pola wyboru).

Widok z powyższą kontrolką pola wyboru związany z bazową wartością logiczną. W zależności od interwału sondowania pole wyboru będzie aktualizowane wraz ze zmianą stanu serwera. Jeśli pole wyboru zostanie kliknięte, zdarzenie zostanie wysłane do modelu powodującego aktualizację serwera.

Optymalnie ta próbka będzie działać na Windows Phone 7, ale w mgnieniu oka byłbym zadowolony z czegoś, co wspierało SL3 (nie było dozwolone korzystanie z routingu poleceń SL4).

Staram się zrozumieć, jak sprawić, aby MVVM-Light działała dla mnie i podejrzewam, że ekspert mógł tak szybko zakodować próbkę ... Podejrzewam również, że jest to dość powszechny wzorzec dla wielu aplikacji.

+0

Odpytywanie serwera z urządzenia mobilnego jest co najwyżej zapachem kodu, ale zazwyczaj jest anty-wzorcem, ponieważ ma wpływ na wykorzystanie zasobów. Powinieneś sprawdzić, czy proces serwera wysyła powiadomienie, gdy zmieni się wartość zwrócona przez usługę. Prawdopodobnie uzyskasz dodatkową pomoc, jeśli możesz zademonstrować swoje starania i napotkane problemy. Prośba o napisanie działającego przykładu rzadko jest udaną strategią uzyskania pomocy. –

+0

Uczciwa uwaga dotycząca pisania aplikacji z konkretnymi wymaganiami dla kogoś, ale jeśli dostępna jest próbka, która demonstruje co najmniej jedną z głównych zasad, które można powiązać, to jest początek na której można budować. –

Odpowiedz

8

Mick N pomogły, ale to, co naprawdę mnie nad garbem był ten post przez Jeremy Likness: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html

Oto próbka z korzyścią dla innych (zakładając, że nie robię coś naprawdę głupiego):

Najpierw zacząłem używać projektu Mvvm-Light Windows Phone 7.

dodałem do mojego wyboru MainPage.xaml:

<CheckBox Content="Switch 1" 
       IsChecked="{Binding Switch1.PowerState, Mode=TwoWay}" 
       Height="72" HorizontalAlignment="Left" Margin="24,233,0,0" 
       Name="checkBox1" VerticalAlignment="Top" Width="428" /> 

obwieszczeniu IsChecked jest związany Switch1.PowerState użyciu trybu TwoWay tak, że nieruchomość płynie w obie strony.

Kluczem do nauki jest dla mnie, jak włączyć komunikację z mojego wywołania zwrotnego licznika czasu (TimerCB), który będzie uruchomiony na nowym wątku do wątku interfejsu Silverlight. Użyłem pomocnika Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI, który czeka na wątek interfejsu użytkownika.

Musiałem wtedy zdecydować, czy zaimplementować INotifyPropertyChanged w swoim modelu, czy użyć implementacji ViewModelBase Mvvm-Light. Rzeczywiście próbowałem go w dwie strony i działałem, ale zdecydowałem, że lepiej mi się przydaje przy korzystaniu z ViewModelBase, ponieważ obsługuje on "broadcast" i myślę, że w moim prawdziwym projekcie będzie przydatny, ponieważ będę miał wiele ViewModels. Wydaje się nieco nieokrzesanym oparciem "Modelu" na klasie ViewModelBase, ale nie sądzę, że jest jakakolwiek szkoda. (???).

Mój model .cs jest poniżej.

public class OnOffSwitchClass : ViewModelBase // ignore that it's derived from ViewModelBase! 
{ 
    private const Int32 TIMER_INTERVAL = 5000; // 5 seconds 
    private Timer _timer; 

    // Upon creation create a timer that changes the value every 5 seconds 
    public OnOffSwitchClass() 
    { 
     _timer = new System.Threading.Timer(TimerCB, this, TIMER_INTERVAL, TIMER_INTERVAL); 
    } 

    private static void TimerCB(object state) 
    { 
     // Alternate between on and off 
     ((OnOffSwitchClass)state).PowerState = !((OnOffSwitchClass)state).PowerState; 
    } 

    public const string PowerStatePropertyName = "PowerState"; 

    private bool _myProperty = false; 

    public bool PowerState 
    { 
     get 
     { 
      return _myProperty; 
     } 

     set 
     { 
      if (_myProperty == value) 
      { 
       return; 
      } 

      var oldValue = _myProperty; 
      _myProperty = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => 
       RaisePropertyChanged(PowerStatePropertyName, oldValue, value, true)); 
     } 
    } 
} 

W MainViewModel.cs został zmodyfikowany tak, aby obejmować następujące

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

public OnOffSwitchClass Switch1 
{ 
    get 
    { 
     return _Switch1; 
    } 
} 

I dodaje wywołanie DispatcherHelper.Initialize(); w moim konstruktorze aplikacji().

Czy to wygląda prawidłowo?

+1

Jeśli chodzi o pytanie Model, w WP7 używam klasy modelu do odczytu/zapisu do pamięci przejściowej i pamięci izolowanej. ViewModels służą do prezentacji danych, do których mają wiązać widoki/strony. Jeśli używasz swojego Modelu jak modelu widoku, być może powinien to być model widoku. –

+0

Wolę wywoływać metodę DispatcherHelper.Initialize() zarówno w App.xaml.cs "Appliance_Launching i Appliance_Activated metod. –

+0

Dzięki Matt - dlaczego w _Launching & _Activated i nie w konstruktorze? – tig

3

Sprawdź ten wpis na blogu autorstwa Joosta van Schaika, który był ostatnio połączony (przez kP z pamięci?) Na forach wp7.

http://dotnetbyexample.blogspot.com/2010/07/using-mvvm-light-to-drive-windows-phone.html

wątpię znajdziesz „próbka”, które również zdarza się realizować swoje „wymagania”, ale przynajmniej z próbki, która robi to, co tytuł pytanie opisuje można się nauczyć, a następnie zastosować więcej szczegółowe wymagania do niego. wskaźnik

+0

Przykład Joosta był dla mnie bardzo pomocny. Nie było to tak proste, jak się spodziewałem, ale ujawniło kilka kluczowych wzorców. Dzięki. – tig

+0

yw :)/15char .. –