2011-04-29 16 views
21

Estoy empezando con Caliburn Micro. Quiero tener un cuadro combinado con una lista de cadenas, y cuando el usuario selecciona un elemento, quiero que se me llame. Debería ser simple, ¿verdad? Estoy impaciente, y 5 minutos de Google no me lo han solucionado, ¡así que Apiladores al rescate!Cómo capturar la selección de cuadro combinado en Caliburn Micro?

Nota: Estoy a favor de una respuesta que me muestre cómo poner esto en el modelo de vista. Evitar complejos XAML es el objetivo de un marco MVVM, en mi humilde opinión.

+0

Otra solución bastante elegante aquí: http://stackoverflow.com/questions/4041233/binding-selectionchanged-to-viewmodel-using-caliburn-micro – buckley

Respuesta

59

Caliburn.Micro ha cocido en las convenciones de apoyo ItemsControl (por ejemplo, ComboBox o ListBox) controles basados ​​que hacen que el requerido en xaml you Ver mínima.

Primero tiene la convención estándar donde un contenido de controles se vinculará a una propiedad de ViewModel con el mismo nombre que el control. En el caso de ItemsControl, la propiedad de contenido de controles es ItemsControl.ItemsSource. Y la segunda convención que obtienes de la caja con Caliburn.Micro es que se intentará enlazar ItemsControl.SelectedItem a una propiedad de ViewModel que tiene el nombre singularizado del control, con "Activo", "Seleccionado" o "Actual" antepuesto (vea ConventionManager en la fuente de Caliburn.Micro).

esto en mente usted puede lograr lo que quiera con lo siguiente en su Vista:

<ComboBox x:Name="Strings"></ComboBox> 

y en su modelo de vista:

public BindableCollection<string> Strings 
{ 
    get 
    { 
     // silly example of the collection to bind to 
     return new BindableCollection<string>(
         new string[]{ "one", "two", "three"});    
    } 
} 

private string _selectedString; 
public string SelectedString 
{ 
    get { return _selectedString; } 
    set 
    { 
     _selectedString= value; 
     NotifyOfPropertyChange(() => SelectedString); 
     // and do anything else required on selection changed 
    } 
} 

La primera convención recoge el nombre de control ("Cuerdas ") y enlaza ComboBox.ItemsSource a la propiedad ViewModel Strings. La segunda convención primero singulariza "Cadenas" a "Cadena" y antepone "Seleccionado" para obtener la propiedad "Cadena Seleccionada" para vincular ComboBox.SelectedItem a. Se propone

+0

Esta debería ser la respuesta aceptada aquí IMO. Esto obtiene rids del desagradable código de enlace en XAML que nombra la función de evento en ViewModel, y se basa en las convenciones de Caliburn.Micro como debería. +1 a usted, señor. –

+0

Estoy de acuerdo, una explicación muy clara, gracias. –

+0

+1 - Son respuestas tan claras y concisas como esta que me alegran de estar en SO ... –

12
<ListBox x:Name="Items" ItemsSource="{Binding Path=Items}" cal:Message.Attach="[Event SelectionChanged]=[Action SelectedItemChanged($this.SelectedItem)]"> 
+1

Eso es un montón de XAML para manejar un evento. Pensé que el objetivo de Caliburn era utilizar la convención para reducir todo ese desorden. –

+0

tenía razón, se puede hacer con mucho menos xaml;) – Bas

+0

¿cuál es la definición de cal aquí? –

Cuestiones relacionadas