2009-08-10 14 views
6

Por favor, no juzgue estrictamente si esta pregunta fue discutida previamente o indirectamente respondida en grandes blogs cercanos de prism y mvvm. En aplicación WPF de clases RelayCommand o DelegateCommand hay un manejador de sucesos talesMVVM (ICommand) en Silverlight

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

pero en SL subconjunto de espacios de nombres No hay clase Administrador de comandos. Y aquí es donde estoy atascado. Todavía no he encontrado una solución para esto en la adopción de MVVM para SL (PRISM es tan complejo para mí todavía). Diferentes aplicaciones simples HelloWorldMVVM no se ocupan en absoluto.

Gracias de antemano y lo siento por mi Inglés -)

Respuesta

5

No hay soporte para los comandos en Silverlight. Cuando el usuario manipula controles en su vista, deberá escribir código (por ejemplo, controladores de eventos) que modifique el modelo de vista en el código subyacente para su vista. Esto podría ser algo tan simple como llamar a un método en el modelo de vista cuando el usuario hace clic en un botón en la vista. Al usar PRISM, puede crear propiedades adjuntas en el XAML para su vista, para deshacerse de estos manejadores de eventos, pero si prefiere no usar PRISM, puede simplemente usar los controladores de eventos.

Otro aspecto que tendrá que manejar es modificar la vista cuando cambie el modelo de visualización. En particular, querrá habilitar y deshabilitar los controles según el estado del modelo de vista. Para lograr esto, deberá vincular la propiedad IsEnabled de un control a algo en el modelo de vista que refleje si se permite una determinada operación. La implementación de objetos personalizados IValueConverter que se convierten en valores booleanos suele ser útil. Por ejemplo, si su modelo de vista tiene una propiedad que representa un recuento y desea que un control particular de la vista solo se active cuando el recuento es mayor que cero, puede crear un convertidor de valor que se convierta en true cuando el número sea mayor que cero y usa este convertidor de valor en el enlace.

Si intenta adaptar un ejemplo WPF de una aplicación MVVM tendrá que deshacerse de todos los usos de comandos y sustituir su propio código. El código en su ejemplo no es significativo en Silverligt, pero en WPF está involucrado en el proceso de determinar si un control en la vista está habilitado, visible, etc.

+0

Creo que está un poco equivocado: existe soporte de ICommand (puede estar limitado, pero existe y existe la clase ICommand) en Silverlight 2 –

+1

Es cierto que la interfaz 'ICommand' se define en Silverlight, pero no se usa en ninguna parte, y la infraestructura completa de WPF que funciona tan bien con el patrón MVVM está ausente en Silverlight. –

+0

Gracias. Pensé que la presencia de ICommand significa un completo soporte de mando, así que estaba equivocado - (Entonces, resulta que la implementación de MVVM en SL no es tan fácil, como en WPF. He encontrado solo una forma por ahora - usando propiedades y comportamiento adjuntos al igual esto: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ o utilizando ready framework, donde se incluyen muchos de los eventos http: // nroute. codeplex.com –

5

Silverlight 4.0 es compatible con la interfaz ICommand y proporcionará así un WPF como ordenar la infraestructura.

Cuestiones relacionadas