2010-09-07 8 views
11

Ich bin auf der Suche nach einem Beispiel, das auf die leichteste Weise Folgendes veranschaulicht:Eine super-einfache MVVM-Light WP7 Probe?

Ein Modell, das einen SOAP-basierten Webdienst aufruft; Polling regelmäßig, um den neuesten Wert zu erhalten (vorausgesetzt, der SOAP-Dienst gibt einen booleschen Wert zurück). Das Modell sollte auch das Aufrufen einer SOAP-Methode unterstützen, die den Booleschen Wert auf dem Server ändert.

Ein ViewModel, mit dem der zugrunde liegende Boolean an Steuerelemente in der Ansicht gebunden werden kann (z. B. an ein Kontrollkästchen).

Eine Ansicht mit dem obigen Checkbox-Steuerelement, das an den zugrunde liegenden booleschen Wert gebunden ist. Abhängig vom Abfrageintervall wird das Kontrollkästchen aktualisiert, wenn sich der Serverstatus ändert. Wenn das Kontrollkästchen angeklickt wird, wird das Ereignis an das Modell gesendet, wodurch der Server aktualisiert wird.

Optimal funktioniert dieses Beispiel unter Windows Phone 7, aber zur Not würde ich mit etwas zufrieden sein, das SL3 unterstützt (keine Verwendung von SL4-Befehlsrouting erlaubt).

Ich kämpfe mit dem Versuch zu verstehen, wie man MVVM-Light für mich arbeiten lässt und ich vermute, dass ein Experte eine Probe so schnell programmieren könnte ... Ich vermute auch, dass dies ein ziemlich häufiges Muster für eine Menge ist von Apps.

+0

Das Abrufen eines Servers von einem mobilen Gerät ist bestenfalls ein Code-Geruch, aber in der Regel ein Anti-Pattern, da es Auswirkungen auf die Ressourcennutzung hat. Sie sollten überprüfen, ob der Serverprozess eine Benachrichtigung sendet, wenn sich der vom Dienst zurückgegebene Wert ändert. Sie erhalten wahrscheinlich auch mehr Hilfe, wenn Sie demonstrieren können, was Sie versucht haben und welche Probleme aufgetreten sind. Nach jemandem zu fragen, um ein funktionierendes Beispiel zu schreiben, ist selten eine erfolgreiche Strategie, um Hilfe zu bekommen. –

+0

Fairer Kommentar zum Schreiben einer App mit spezifischen Anforderungen für jemanden, aber wenn ein Beispiel verfügbar ist, das mindestens eine der wichtigsten Grundlagen zeigt, die verknüpft werden können, dann ist das ein Anfang, auf dem man aufbauen kann. –

Antwort

8

Mick Ns Zeiger geholfen, aber über den Buckel, was mich wirklich diesen Beitrag von Jeremy Likness: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html

Hier ist die Probe für den Nutzen der anderen (vorausgesetzt, ich tue nichts wirklich dumm):

Zuerst begann ich mit dem Mvvm-Light Windows Phone 7-Projekt.

Ich habe ein Kontrollkästchen, um meine 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" /> 

Beachten Sie die IsChecked zu Switch1.PowerState gebunden ist, den TwoWay-Modus, so dass die Eigenschaft in beiden Richtungen fließt.

Ein Schlüssel lernen für mich ist, wie die Kommunikation von meinem Timer Callback (TimerCB), die auf einem neuen Thread auf dem Silverlight UI-Thread ausgeführt wird, zu ermöglichen. Ich habe den Helfer Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI benutzt, der auf dem UI-Thread wartet.

Ich musste dann entscheiden, ob ich in meinem Modell InotifyPropertyChanged implementieren, oder Mvvm-Light ViewModelBase Implementierung verwenden. Ich probierte es tatsächlich in beide Richtungen und hatte es funktioniert, aber ich entschied mich, ViewModelBase besser zu verwenden, weil es "broadcast" unterstützt und ich glaube, dass es in meinem aktuellen Projekt nützlich sein wird, da ich mehrere ViewModels haben werde. Es scheint ein bisschen ungehobelt zu sein, ein "Model" auf der ViewModelBase-Klasse zu gründen, aber ich denke nicht, dass es schaden könnte. (???).

Mein Modell .cs ist unten.

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)); 
     } 
    } 
} 

Die MainViewModel.cs wurde modifiziert, um gehören die folgenden

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

public OnOffSwitchClass Switch1 
{ 
    get 
    { 
     return _Switch1; 
    } 
} 

Und fügte ich einen Anruf zu DispatcherHelper.Initialize(); in meinem App() - Konstruktor.

Sieht das richtig aus?

+1

Soweit die Modellfrage, in WP7 verwende ich eine Modellklasse zum Lesen/Schreiben in Transient-Speicher und isolierten Speicher. ViewModels dienen zum Darstellen von Daten, an die die Ansichten/Seiten gebunden sind. Wenn Sie Ihr Modell wie ein Ansichtsmodell verwenden, sollte es vielleicht ein Ansichtsmodell sein. –

+0

Ich bevorzuge DispatcherHelper.Initialize() in App.xaml.cs 'Appliance_Launching und Appliance_Activated Methoden aufrufen. –

+0

Danke Matt - warum in _Launching & _Activated und nicht im Konstruktor? – tig

3

Überprüfen Sie diesen Blog-Post von Joost van Schaik, der vor kurzem (von kP aus dem Speicher?) Über wp7 Foren verlinkt wurde.

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

Ich bezweifle es eine „Probe“ finden, was geschieht auch Ihre „Anforderungen“, zu implementieren, aber zumindest mit einer Probe, die das tut, was Ihre Frage Titel beschreibt Sie lernen können, und wenden Sie dann Ihre mehr detaillierte Anforderungen an sie.

+0

Joosts Beispiel war auch sehr hilfreich für mich. Es war nicht so einfach, wie ich es mir erhofft hatte, aber es zeigte einige Schlüsselmuster auf. Vielen Dank. – tig

+0

yw :)/15char .. –