Tengo un ListView que contiene sólo los botones. Lo que quiero hacer es muy simple, quiero tener el índice del botón que ha sido pulsado. El recuento de la lista varía de 0 a 100, de modo que cuando el usuario hace clic en el botón 6, necesito este número para su procesamiento.

He definido mi ListView como este:

<ListView Name="myListView" 
          ItemsSource="{Binding Source={StaticResource myDataModel}, 
          Path=StatusList, 
          Mode=OneWay}">
          <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"></StackPanel>
                </ItemsPanelTemplate>
          </ListView.ItemsPanel>

          <ListView.ItemTemplate>
               <DataTemplate>
                    <Button Mode=OneWay}"  
                            Click="Button_Click"/> 
                </DataTemplate>
           </ListView.ItemTemplate>
 </ListView>

Mi idea original era crear un botón personalizado con un ID y enlazar el índice de la ID, pero no puedo averiguar cómo hacerlo.

He intentado:

int a = myListView.Items.IndexOf(((Button)sender)); 

en el controlador de eventos, pero siempre devuelve 0xffffffff
¿alguien puede decirme cómo obtener el índice del botón pulsado?

  • por qué necesita el índice del botón pulsado? esperemos que no tome el índice para buscar el dataitem??
  • Necesito el índice de los botones, porque tengo que ejecutar una consulta para obtener el resultado apropiado de un dispositivo conectado al servidor, y que el dispositivo tiene el mismo número que el de los botones de índice
InformationsquelleAutor peer | 2011-12-05

2 Comentarios

  1. 2

    Esto debería funcionar:

    Cambiar su ListView con un ItemsControl y establecer un AlternationCount a un número muy alto (mayor que el recuento máximo de elementos en su lista).
    Hacer un comando y pasar el índice actual como parámetro.

    XAML:

    <Window.CommandBindings>
      <CommandBinding 
       Command="Select" 
       Executed="Click_Executed" />
    </Window.CommandBindings>
    
    <ItemsControl AlternationCount="9999" Name="myListView" 
          ItemsSource="{Binding Source={StaticResource myDataModel}, 
          Path=StatusList, 
          Mode=OneWay}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Horizontal"></StackPanel>
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Button Command="Select"
                    CommandParameter="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource TemplatedParent}}"
                    Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex)}" Width="200" Height="20" Click="Button_Click"/>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>

    Código Detrás:

    private void Click_Executed(object sender, ExecutedRoutedEventArgs e)
    {
      MessageBox.Show("Index: " + e.Parameter.ToString());
    }
    • Esto funciona bien, pero cuando voy a agregar una línea para cambiar el fondo usando un convertidor, el convertidor no se aplica. Simplemente he añadido la siguiente línea en el contenido de unión (que cambié a una Etiqueta de enlace) ¿tiene usted alguna idea de por qué? Background=»{Binding Source={StaticResource myDataModel}, Path=StatusList, Convertidor={StaticResource StatusConverter}}»
    • Me fijo que a mí mismo Background=»{Converter={StaticResource StatusConverter}}»
    • Me alegra poder ayudar … Si tienes problemas con los enlaces en el futuro tener una mirada en la ventana de salida. Los errores deben ser enumerados.
  2. 27

    Utilizar el DataContext para encontrar el elemento:

    var item = (sender as FrameworkElement).DataContext;
    int index = myListView.Items.IndexOf(item);
    • Gracias por tu respuesta, pero ahora devuelve 0 x 00000000 por cada clic en un elemento. Tal vez porque el contenido no es nunca conjunto?
    • Esto funciona con DataTemplates en listas como la de tu ejemplo, ¿me puedes mostrar el código? Tal vez la propiedad DataContext de que el botón está configurado de manera diferente. Si devuelve 0, que significa que piensa que usted ha hecho clic en el primer elemento.
    • excepto para el entorno <Grid><DockPanel> no hay más código. Traté de Botón 4 y 10, nada ha cambiado.
    • Gran ejemplo de Bas. Yo estaba tratando de averiguar cómo a haga clic en una imagen en una listviewitem y tiene el controlador saber qué elemento fue, y este hizo el truco. Dim elemento Como Mielemento = CType(sender, FrameworkElement).DataContext … gracias!!!!
    • Funcionó sin ningún tipo de modificación en el código. Gracias Bas!!!
    • Muchas gracias, me ayudo =)

Dejar respuesta

Please enter your comment!
Please enter your name here