c# - wpf listview
WPF ListView con botones en cada lĂnea (3)
Tengo una lista de Games
que solo tiene una ID
, una Date
y una Time
. Estoy configurando esta lista como el DataContext
.
Entonces tengo un DataTemplate
para estos juegos que es:
<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 usar la plantilla, simplemente estoy haciendo esto:
<ListBox ItemsSource="{Binding}"></ListBox>
Necesito agregar un Button
a cada línea en esta vista de lista que tenga el mismo evento de clic, pero de alguna manera pasará la ID del juego para el cual se hace clic en el botón.
¿Cómo puedo hacer esto? Estoy atascado. Si no tiene sentido, hágamelo saber y trataré de explicarlo mejor.
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
}
Fácilmente. Agrega un Button
a tu plantilla de datos , dale un Command
y luego configura el CommandParameter="{Binding}"
. El DataContext dentro de un DataTemplate es el objeto.
Según lo solicitado, algunos enlaces para el uso de comandos.
- Comandos WPF Parte 1: Conceptos básicos
- Comandos de WPF, parte 2: enlaces y gestos de comandos
- MSDN Descripción de eventos y comandos enrutados en WPF (AVANZADO)
HTH,
Para la primera parte, agregue un Button
a la DataTemplate
y suscríbase al evento Click
<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 del controlador de eventos, puede obtener el DataContext
del Button
pulsado y averiguar el ID como
private void Button_Click(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
Game game = button.DataContext as Game;
int id = game.ID;
// ...
}