2012-01-01 18 views

Respuesta

18

Prefiero usar un enlace al SelectedItem e implementar cualquier funcionalidad en la configuración de la propiedad de enlace.

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 

...

public class ViewModel 
{ 
    public IEnumerable<Item> Items { get; set; } 

    private Item selectedItem; 
    public Item SelectedItem 
    { 
     get { return selectedItem; } 
     set 
     { 
      if (selectedItem == value) 
       return; 
      selectedItem = value; 
      // Do logic on selection change. 
     } 
    } 
} 
+0

Consejo excelente, gracias – James

+0

¿Funcionará con la selección múltiple? – Simsons

+0

@Simsons Solo si tiene una forma de enlazar a la selección múltiple. Creo que la propiedad SelectedItem se ignora durante la selección múltiple. –

0

Sugeriría usar RelayCommand. Utilice el MVVM Light Toolkit o simplemente use las clases RelayCommand y CommandManager desde Josh Smith's implementations. Yo personalmente uso solo las dos clases, por lo que no necesito todo el kit de herramientas.

Si bien esto definitivamente funcionará, podría haber una manera más fácil dependiendo de lo que esté haciendo. Puede ser más fácil vincular un objeto al SelectedValue del ListBox y escuchar ese valor para cambiar.

+0

Gracias a todos por su ayuda) Feliz Año Nuevo !!! –

2

Básicamente, usted tiene algunas opciones:

  1. utilizar la propiedad SelectedItem del cuadro de lista para unirse a una propiedad en el backend (es decir, en vista del modelo) y realice la lógica en el colocador como se describe en Cameron MacFarland.
  2. Utilice una biblioteca de terceros que tenga un evento genérico para ordenar el comportamiento como en el enlace publicado por Pedro Lamas.
  3. Si no desea usar bibliotecas de terceros o escribir lógica dentro de la propiedad setter es de alguna manera inaceptable, puede crear su propio comportamiento para el control ListBox. Se suscribiría al evento de control SelectionChanged y ejecutaría un comando (el comando podría ser una propiedad de dependencia expuesta por el comportamiento).
15

Ésta es la manera en que se puede llegar a la Selección cambió eventos en su MVVM Aplicación Primero de todo lo que digo que el Comando de la propiedad sólo funcionan en el botón ahora tenemos que explícitamente vinculante de este inmueble en nuestra acontecimiento cambió Selección como la caja de lista o un cuadro combinado en su XmaI presentar

<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118"> 

     <Local:Interaction.Triggers> 
      <Local:EventTrigger EventName="SelectionChanged"> 
       <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/> 
      </Local:EventTrigger> 
     </Local:Interaction.Triggers> 
    </ListBox> 

para ello hay que añadir Syatem.Windows DLL.La interactividad ahora u tenga que añadir referencias en su archivo XAML espacio de nombres como

xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity" 

en su clase ViewModel que tiene que definir su mando en la estructura de Con

public ViewModel123() 
    { 
     MyCommand = new RelayCommand<string>(TestMethod); 

    } 

ahora crear el método TestMethod que puede manejar el selección cambió evento

private void TestMethod(string parameter) 
    { 
     MessageBox.Show(parameter); 
    } 

Espero que esto pueda ayudarlo.

+0

Prefiero esta forma porque creo que es más limpia. –

Cuestiones relacionadas