2011-05-17 5 views
7

básicamente tengo un control de pivote en mi aplicación WP7 que contiene 3 vistas. En cada vista estoy llamando a uno de mis 3 servicios web diferentes que ejecuto. Lo que trato de hacer es llamar al servicio solo cuando navegan hacia esa vista en particular.¿Cómo detectar Pivot View usando MVVM en WP7?

Es bastante simple usar el código de atrás porque todo lo que haces es usar el índice seleccionado con una declaración de cambio y puedes disparar ciertos métodos en consecuencia. ¿Alguna idea sobre cómo lograr esto desde un modelo de vista?

NOTA: Estoy usando MVVM Light.

ACTUALIZACIÓN: Aquí está mi código que normalmente me gustaría utilizar:

private void PivotItem_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     int currentPivot = ResultsPivot.SelectedIndex; 
     switch (currentPivot) 
     { 
      case 0: 
       //Fire Method 1 
       break; 
      case 1: 
       //Fire Method 2 
       break; 
      case 2: 
       //Fire Method 3 
       break; 
      default: 
       //Fire default method 
       break; 
     } 
    } 
+0

Muestra el código subyacente que estás intentando convertir. –

+0

@Rick Agregué el código que normalmente usaría. – loyalpenguin

Respuesta

5

El enfoque estándar con MVVMLight es dividir su modelo de vista en datos y comandos. La mayoría de las cosas que utilizas son enlaces de datos relacionados, propiedades, etc. pero los comandos realmente hacen algo.

En este caso, lo que está llamando "Método de Incendio 1" es un método normal que se ajusta al patrón que debe convertir en un comando. Si ya tienes comandos, sabes de lo que estoy hablando.

El pegamento para eventos como SelectionChanged que habría cableadas con código subyacente en MVVMLight se ofrecen EventToCommand que es un fragmento de XAML que se pone en el XAML con el elemento de pivote en lugar de en el lanzador evento.

Este es el patrón: EventToCommand es la clave para conectar eventos XAML a los comandos del modelo de vista sin cualquier código subyacente. Lo mejor que puedes hacer es usar las muestras de MVVMLight para ver cómo funciona el EventToCommand porque hay muchas formas de usarlo.

Pero aquí está la versión básica:

<controls:PivotItem Name="pivotItem"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <cmd:EventToCommand Command="{Binding SelectServiceCommand}" 
           CommandParameter="{Binding SelectedIndex, ElementName=pivotItem}"/> 
     </i:EventTrigger> 
     <!-- other stuff --> 
    </i:Interaction.Triggers> 
</controls:PivotItem> 

y para hacer este trabajo la SelectServiceCommand tiene que existir realmente en la vista-modelo y tiene que tener un parámetro y hacer lo correcto para 0 , 1, 2, 3, etc.

2

No he utilizado MVVM Light directamente, pero usted debería ser capaz de unir el índice/elemento seleccionado a una propiedad en la ver modelo. Cuando se cambia esa propiedad, puedes hacer tu cambio.

0

Me gusta mantener las cosas simples en situaciones como estas donde la Vista debe notificar al ViewModel que algo tan trivial ha cambiado (por ejemplo: un cambio de selección de combobox trivial que realmente tiene nada que ver con el estado de la vista (es decir, ViewModel)).

Para su caso específico, en su instrucción de cambio, simplemente llame a un método público en su ViewModel. ¿Cómo obtener la referencia del modelo de vista? Puede obtener eso mediante el DataContext de la vista. Entonces ahora sus vistas pueden llamar a los métodos públicos (y propiedades) dentro de su viewModel.

Por cosas importantes, pegue con DataBinding. de lo contrario, simplemente llame directamente. Ahorra tanto tiempo y molestias.

0

¡Obtengo el índice del pivotItem que estoy dejando, no el PivotItem que voy a usar! .

El uso de este:

<controls:Pivot x:Name="pivMain" Title="{Binding AppName}" > 
     <Custom:Interaction.Triggers> 
      <Custom:EventTrigger EventName="SelectionChanged"> 
        <cmd:EventToCommand Command="{Binding SelectServiceCommand}"   
        CommandParameter="{Binding ElementName=pivMain, Path=SelectedIndex}"/> 
      </Custom:EventTrigger> 
     </Custom:Interaction.Triggers> 
4

Esto puede ser resuelto de la siguiente manera

<controls:Pivot x:Name="PivotControl" FontSize="18" > 
     <Custom:Interaction.Triggers> 
      <Custom:EventTrigger EventName="SelectionChanged"> 
       <GalaSoft_MvvmLight_Command:EventToCommand x:Name="VideoPivotClicked" 
                  Command="{Binding VideoPivotClicked, Mode=OneWay}" PassEventArgsToCommand="True" /> 
      </Custom:EventTrigger> 
     </Custom:Interaction.Triggers> 

Luego, en el modelo de vista de agregar esta

 public RelayCommand<SelectionChangedEventArgs> VideoPivotClicked 
    { 
     get; 
     private set; 
    } 

VideoPivotClicked = new RelayCommand<SelectionChangedEventArgs>(arg => 
                 { 
                  PivotItem pivotItem = arg.AddedItems[0] as PivotItem; 
                  Pivot pivot = pivotItem.Parent as Pivot; 
                  Debug.WriteLine(pivot.SelectedIndex); 
                 } 
     ); 

Usted no recibirá la PivotItem que ¡vas a! y no el que te estás yendo