2009-06-04 18 views
27

Para aquellos que realizan MVVM puro, ¿cómo se maneja un evento ComboBox SelectionChanged sin volver atrás al código?¿Cómo se maneja un ComboBox SelectionChanged en MVVM?

Probé p. AttachedBehaviors pero Evento = "SelectedChanged" No se admite:

<ComboBox> 
    <ComboBoxItem Content="Test1"> 
     <c:CommandBehaviorCollection.Behaviors> 
      <c:BehaviorBinding Event="SelectionChanged" 
           Command="{Binding SelectedChanged}" 
           CommandParameter="MainBorder123"/> 
     </c:CommandBehaviorCollection.Behaviors> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Test2"/> 
    <ComboBoxItem Content="Test3"/> 
</ComboBox> 

Respuesta

3

se utilizaría un activador de datos para activar un evento en un elemento de interfaz de usuario diferente, como "activar/desactivar, o visible/invisible"

Si desea que el elemento seleccionado muestre los datos del objeto en otros elementos de la interfaz de usuario, entonces debe usar el enlace de datos y establecer el contexto de datos de los elementos de visualización de datos de la interfaz de usuario para vincular al elemento seleccionado actualmente en el cuadro combinado.

+0

bien, podría hacerlo si todo lo que quiero hacer es cambiar el XAML, pero ¿y si quiero, por ejemplo use un comboxbox para ejecutar código que hace algo que XAML no puede hacer, p. cargar un nuevo archivo de recursos y adjuntarlo a la ventana actual? o v.g. cambie algunos datos en la base de datos, etc. –

+0

Luego podría usar un enlace de su Modelo de Vista al cuadro combinado SelectionChanged. No estoy seguro de dónde buscaría un ejemplo, pero Karl Shifflet y Josh Smith son los dos principales blogs a los que voy para que MVVM ayude a que los enlaces a sus blogs se encuentren a continuación. http://karlshifflett.wordpress.com/2009/06/03/troubleshooting-silverlight-3-broken-bindings/ http://joshsmithonwpf.wordpress.com/2009/05/20/device-specific- interaction-logic-in-an-mvvm-application/ Lo siento, no puedo ayudar más en los detalles, soy bastante nuevo para WPF y MVVM. – Peter

+0

oops se olvidó de mencionar Karl Shifflet ha estado haciendo un montón de eventos de la línea de negocios de WPF, busque en su blog para ellos, contienen algunos ejemplos de PowerPoint y ejemplos de código excelentes también. – Peter

25

No estoy seguro de si lo que buscas es posible, pero la forma en que lo hago es simplemente vincular el SelectedItem a una propiedad en el modelo de visualización. Luego, dentro del conjunto de propiedades, invoco cualquier código personalizado que quiera que ocurra, es decir, establecer otras propiedades basadas en la regla. Si necesito que el elemento seleccionado se vincule también a un objeto (para que otros controles encuadernados se actualicen) configuro esto también en el setter y envío una notificación.

+0

Creo que esta forma tiene más sentido, y hasta ahora me funciona bien. Gracias por publicar esto. – Aphex

+3

Me parece una manera increíblemente dolorosa de hacerlo. Para aplicaciones simples, hacer esto en lugar de un comando es fácil. Pero rápidamente se vuelve difícil de manejar. Las propiedades deben contener datos, no realizar acciones. Se rompe la sincronización y hace que sea más difícil de depurar ya que Visual Studio pasará por los setters/getters de propiedades de forma predeterminada. –

53

Esta publicación es bastante antigua, pero dado que tengo el mismo problema. Así es como lo resolví (usando framework 4.0): la idea es usar System.Windows.Interactivity.

En el XAML:

<ComboBox ItemsSource="{Binding Items}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

Entonces sólo tiene que poner en práctica el SelectionChangedCommand en su modelo de vista.

+0

También está 'CallMethodAction' si no necesita un' Command' aunque sí requiere agregar ref a 'Microsoft.Expression.Interactions.dll' – markmnl

+1

y cómo vincularía el' SelectedItem' o 'SelectedValue' del' ComboBox' aquí sin darle un nombre? – Maslow

+0

@Maslow o cualquier otra persona que desee pasar el elemento seleccionado como parámetro: use binding, consulte [aquí] (https://stackoverflow.com/a/34668511/63209). En mi caso, nombré el 'ComboBox', por ejemplo," MyCombo ", y luego el enlace fue un simple' {Binding ElementName = MyCombo, Path = SelectedItem} '. – Paul

Cuestiones relacionadas