silverlight - tutorial - Selección de enlace Cambiado a ViewModel usando Caliburn.Micro
caliburn micro documentation (2)
Utilizo esta técnica regularmente y me siento muy cómodo con ella.
Me parece perfectamente bien que la VM reaccione a su propio cambio de estado, sin la necesidad del actor externo (que por cierto es la Vista, pero podría ser otro componente, también) para establecer el nuevo estado, ENTONCES señal de que la VM es el estado cambiado
Sin embargo, si realmente lo desea, puede usar la propiedad adjunta Message.Attach para conectar un evento en la Vista a una acción en la VM:
cal:Message.Attach="[Event SelectionChanged] = [OnSelectionChangedAction]"
(ver también http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions )
Hemos usado Caliburn.Micro en un nuevo proyecto de Silverlight y todo funciona estupendamente. Las convenciones integradas obligan a los botones a hacer clic en eventos en viewModel, pero no estoy seguro de cuál es la mejor forma de manejar el evento selectionChanged en las cuadrículas de datos y las cajas combinadas.
Por el momento, estoy vinculando el elemento seleccionado y llamando a la lógica personalizada, pero siento que esto es un poco olor a código y que debería separar la configuración de la propiedad y el evento selectedChange. Pero si separe estos, ¿cómo puedo vincular el evento de selección cambiado a mi viewModel, por comandos? o un EventTrigger? ¿O es el código abajo aceptable? Es un pequeño cambio pero hago esta lógica en todas partes.
private Foo _selectedFoo;
public Foo SelectedFoo
{
get
{
return _Foo;
}
set
{
if (_Foo != null && _Foo.Equals(value)) return;
_Foo = value;
NotifyOfPropertyChange("SelectedFoo");
NotifyOfPropertyChange("CanRemove");
LoadRelatedBars();
}
}
Aquí hay una muestra para MVVM y Caliburn.Micro usando. Algunas acciones como SelectionChanged deberían obtener argumentos explícitos de un evento, por lo que debe establecerlo en la parte de acción de evento de calibración. El primer argumento frecuente es pasar $ this (el elemento ui real al que se adjunta la acción) y obtiene en el manejador un contexto de datos para la fila, pero para llegar a la Grid debe pasar $ source, como primer argumento ($ source - es el FrameworkElement real que activó el ActionMessage para ser enviado). De acuerdo con el manual de Caliburn manual .
XAML
cal:Message.Attach="[Event SelectionChanged]=[Action DataGrid_JobTypesSelectionChanged($source,$eventArgs)];"
Código:
public void DataGrid_JobTypesSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var grid = sender as DataGrid;
JobTypesSelectedCollection = grid.SelectedItems.Cast<JobComplexModel>().ToList();
}