2011-12-29 39 views

Respuesta

35

solución MVVM:

Enlazar las ItemsSource y SelectedItem propiedades del ComboBox a propiedades en el modelo de vista:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 

En MainViewModel.cs:

public ObservableCollection<string> MyItems { get; set; } 

private string _mySelectedItem; 
public string MySelectedItem 
{ 
    get { return _mySelectedItem; } 
    set 
    { 
    // Some logic here 
    _mySelectedItem = value; 
    } 
} 

Code- detrás de la solución:

Si no desea usar MVVM, puede agregar el uso de este:

<ComboBox SelectionChanged="ComboBox_SelectionChanged" /> 

y añadir en MainWindow.xaml.cs:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // Some logic here 
} 
+1

intenté esto pero no está activando el evento de cambio de selección. – Tanya

+1

¿Cómo marcó esto? No debe suscribirse a un evento de control en este caso – sll

+0

Se supone que no debe desencadenar el evento, ya que la lógica ocurre cuando 'MySelectedItem' cambia el valor en su lugar. He actualizado mi respuesta con un controlador de eventos, si desea usar eso en su lugar. – snurre

1

Primero, aclaremos las cosas: no puede cambiar el evento, sino que puede suscribirse.

Dado que no ha proporcionado ninguna información sobre dónde desea gestionar los cambios de selección, asumiré el manejo de escenario más común en el ViewModel subyacente. Según MVVM, ViewModel no debería saber nada acerca de View, por lo que no puede suscribirse directamente desde ViewModel al evento del control de una Vista. Pero puede vincular una propiedad de ViewModel a SelectedItem o SelectedIndex para que se active mientras cambia la selección.

<ComboBox 
     SelectedIndex="{Binding SelectedIndexPropertyName}" 
     ... /> 

hay otras soluciones que hacen el manejo de código detrás de un Habida cuenta accediendo a un modelo de vista a través de view.DataContext pero sugeriría evitar tal práctica, esto es trabajo en torno a los casos.

5

Su modelo de vista es necesario que implementar INotifyPropertyChanged.

public class MyViewModel : INotifyPropertyChanged 
{ 
    private string _mySelectedItem; 
    public string MySelectedItem 
    { 
     get 
     { 
      return _mySelectedItem; 
     } 
     set 
     { 
      if (_mySelectedItem != value) 
      { 
       _mySelectedItem = value; 
       // Perform any pre-notification process here. 
       if (null != PropertyChanged) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs("MySelectedItem")); 
       } 
      } 
     } 
    } 
} 

El XAML previamente publicado es correcto:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 
+0

Aunque esta es una buena práctica, no ayuda a resolver el problema. @Tanya quería que se le notificara su código en el modelo de vista cuando el usuario cambia la selección de la IU para realizar algunas operaciones en consecuencia. Notificar cambio de propiedad se utiliza para hacer lo contrario de eso. – Bishoy

1

Soy un gran fan de este método.

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

<ComboBox Grid.Column="2" DisplayMemberPath="Data.name" ItemsSource="{Binding Model.Regions}" SelectedItem="{Binding Model.SelectedRegion}"> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <i:InvokeCommandAction Command="{Binding RegionChangedCmd}" /> 
    </i:EventTrigger> 
</ComboBox> 
Cuestiones relacionadas