2010-09-07 7 views
11

Estoy buscando una muestra que demuestre de la manera más liviana posible lo siguiente:¿Una muestra de MVPM-Light WP7 super simple?

Un modelo que invoca un servicio web basado en SOAP; sondeo regular para obtener el último valor (suponiendo que el servicio SOAP devuelve un valor booleano). El modelo también debe admitir la invocación de un método SOAP que cambie el booleano en el servidor.

Un ViewModel que permite que el booleano subyacente se vincule a controles en la Vista (por ejemplo, a una casilla de verificación).

A Ver con el control de casilla de verificación anterior vinculado al booleano subyacente. Según el intervalo de sondeo, la casilla se actualizará a medida que cambie el estado del servidor. Si se hace clic en la casilla de verificación, el evento se enviará al modelo y el servidor se actualizará.

De manera óptima, esta muestra funcionará en Windows Phone 7, pero en caso de apuro estaría contento con algo que admite SL3 (no se permite el uso del enrutamiento de comandos SL4).

Tengo problemas tratando de entender cómo hacer que MVVM-Light funcione para mí y sospecho que un experto podría codificar una muestra así rápidamente ... También sospecho que este es un patrón bastante común para muchos de aplicaciones.

+0

El sondeo de un servidor desde un dispositivo móvil es, en el mejor de los casos, un olor a código pero, por lo general, un antipatrón, ya que tiene implicaciones en el uso de los recursos. Debería ver que el proceso del servidor envíe una notificación cuando cambie el valor devuelto por el servicio. También es probable que obtenga más ayuda si puede demostrar lo que ha intentado y los problemas que ha encontrado. Pedirle a alguien que escriba un ejemplo de trabajo rara vez es una estrategia exitosa para obtener ayuda. –

+0

Comentario justo acerca de cómo escribir una aplicación con requisitos específicos para alguien, pero si hay una muestra disponible que demuestre al menos uno de los fundamentos principales que se pueden vincular, entonces es un comienzo sobre el que se puede construir. –

Respuesta

8

Mick N ayudó, pero lo que realmente me consiguió superar el bajón fue este mensaje por Jeremy Likness: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html

es la muestra para el beneficio de otros (suponiendo que no estoy haciendo nada realmente estúpido) Aquí:

Primero, comencé a usar el proyecto Windows Phone 7 de Mvvm-Light.

he añadido una casilla de verificación a mi 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" /> 

Aviso del IsChecked está obligado a Switch1.PowerState utilizando el modo TwoWay para que la propiedad fluye en ambos sentidos.

Un aprendizaje clave para mí es cómo habilitar la comunicación de mi temporizador de devolución de llamada (TimerCB) que se ejecutará en un nuevo hilo a la hebra de la interfaz de usuario de Silverlight. Usé el helper Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI que espera en el hilo de UI.

Luego tuve que decidir si implementar INotifyPropertyChanged en mi modelo, o usar la implementación ViewModelBase de Mvvm-Light. De hecho, lo intenté en ambos sentidos y lo tuve funcionando, pero decidí que me gustaba usar ViewModelBase porque es compatible con "broadcast" y creo que en mi proyecto real será útil porque tendré múltiples ViewModels. Parece un poco grosero basar un "Modelo" en la clase ViewModelBase, pero no creo que haya ningún daño al hacerlo. (???)

Mi modelo .cs está por debajo.

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

Los MainViewModel.cs se modificó para incluir la siguiente

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

public OnOffSwitchClass Switch1 
{ 
    get 
    { 
     return _Switch1; 
    } 
} 

Y añaden una llamada a DispatcherHelper.Initialize(); en mi constructor App().

¿Esto se ve bien?

+1

En cuanto a la pregunta del modelo, en WP7 utilizo una clase modelo para lectura/escritura en memoria transitoria y almacenamiento aislado. ViewModels es para presentar los datos a los que se vincularán las Vistas/Páginas. Si está utilizando su modelo como un modelo de vista, entonces tal vez debería ser un modelo de vista. –

+0

Prefiero llamar a DispatcherHelper.Initialize() en los métodos App.xaml.cs 'Appliance_Launching y Appliance_Activated. –

+0

Gracias Matt - ¿por qué en _Launching & _Activated y no en el constructor? – tig

3

Mira esta publicación del blog por Joost van Schaik que fue recientemente vinculada (por kP desde la memoria?) En los foros de wp7.

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

dudo encontrará una "muestra" que también pasa a poner en práctica sus "requisitos", pero al menos con una muestra que hace lo que su título de la pregunta describe que se puede aprender y luego aplicar su mayor requisitos detallados para ello. puntero

+0

El ejemplo de Joost fue muy útil para mí también. No fue tan simple como esperaba, pero sí reveló algunos de los patrones clave. Gracias. – tig

+0

yw :)/15char .. –