2011-08-19 63 views
19

Tengo una lista de Games que solo tiene ID, Date y Time. Estoy configurando esta lista como DataContext.WPF ListView con botones en cada línea

Entonces tengo una DataTemplate para estos juegos es decir:

<DataTemplate DataType="{x:Type loc:Game}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="dateBlock" Grid.Column="0" Grid.Row="1" 
        Text="{Binding Date, StringFormat=d}"></TextBlock> 
     <TextBlock Name="TimeBlock" Grid.Column="1" Grid.Row="1" 
        Text="{Binding Time}"></TextBlock> 
     //need to but a button here for each row 
    </Grid> 
</DataTemplate> 

Para utilizar la plantilla, simplemente estoy haciendo esto:

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

tengo que añadir un Button a cada línea en esta vista de lista que tiene el mismo evento de clic, pero de alguna manera pasará el ID del juego para el que se hace clic en el botón.

¿Cómo puedo hacer esto? Estoy atascado. Si no tiene sentido, házmelo saber e intentaré explicarlo mejor.

Respuesta

38

Para la primera parte, añadir un Button a la DataTemplate y suscribirse al Click caso

<DataTemplate DataType="{x:Type loc:Game}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="dateBlock" Grid.Column="0" Grid.Row="1" Text="{Binding Date, StringFormat=d}"></TextBlock> 
     <TextBlock Name="TimeBlock" Grid.Column="1" Grid.Row="1" Text="{Binding Time}"></TextBlock> 
     <Button Click="Button_Click">X</Button> 
    </Grid> 
</DataTemplate> 

En el código detrás de controlador de eventos, se puede obtener el DataContext del Button hecho clic y averiguar la identificación, al igual

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    Game game = button.DataContext as Game; 
    int id = game.ID; 
    // ... 
} 
+1

Gracias que funcionó a la perfección y fue fácil de entender. – twaldron

15

Fácilmente. Agregue un Button a su DataTemplate, dele un Command y luego configure el CommandParameter="{Binding}". El DataContext dentro de una DataTemplate es el objeto.

Según lo solicitado, algunos enlaces a la utilización de comandos.

HTH,

+2

Es una solución más ordenada. Desde que escribí el código MVVM, incluso creo que debo usar controladores de eventos en el código subyacente (es decir, * xaml.cs *). Es mucho mejor. – Dennis

+1

Dennis, un ejemplo de código de cómo hacer el resto de la vinculación de comandos (o al menos un enlace a uno existente) sería realmente útil en su respuesta. En estos casos, también prefiero usar Comandos con el parámetro usando Binding. – EtherDragon

+0

@Ether: Por lo general, comparto un ejemplo cuando es necesario, sin embargo, como los Comandos son un tema tan bien cubierto, haré la búsqueda en Google y añadiré algunos de los mejores resultados a mi respuesta. – Dennis

2

Con un ListBox.ItemTemplate. Luego, en su evento de clic, puede obtener el objeto a través de DataContext.

<ListBox.ItemTemplate> 
     <DataTemplate> 
      <Button Content="^" IsEnabled="{Binding Path=IsNotFirst, Mode=OneWay}" 
      Click="btnMoveFDAup"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 


    private void btnMoveFDAup(object sender, RoutedEventArgs e) 
    { 
     Button btn = ((Button)sender); 
     // btn.DataContext will get you to the row object where you can retrieve the ID 
    } 
+0

¿Cómo obtendré los valores de btn.DataContext? Por ejemplo, en el depurador puedo ver que btn.DataContext apunta a mi clase de datos (LVDATA) y lo que necesito es el valor en el nombre de la cadena. ¿Cómo accedo a esto? – zetar