web-dev-qa-db-fra.com

WPF ListView avec des boutons sur chaque ligne

J'ai une liste de Games qui a juste un ID, un Date et un Time. Je définis cette liste comme DataContext.

J'ai alors un DataTemplate pour ces jeux qui est:

 <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>

Pour utiliser le modèle, je fais simplement ceci:

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

Je dois ajouter un Button à chaque ligne de cette vue de liste qui a le même événement de clic, mais passera en quelque sorte l'ID du jeu pour lequel le bouton est cliqué.

Comment puis-je faire ceci? Je suis coincé. Si cela n'a pas de sens, faites le moi savoir et je vais essayer de mieux vous expliquer.

22
twaldron

Pour la première partie, ajoutez un Button à DataTemplate et abonnez-vous à l'événement 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>

Dans le code derrière le gestionnaire d'événements, vous pouvez obtenir le DataContext du Button cliqué et trouver l'id comme

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

Facilement. Ajoutez un Button à votre DataTemplate , donnez-lui un Command puis définissez le CommandParameter="{Binding}". Le DataContext dans un DataTemplate est l'objet.

Comme demandé, quelques liens vers l'utilisation des commandes.

HTH,

16
Dennis

Avec un ListBox.ItemTemplate. Ensuite, dans votre événement de clic, vous pouvez obtenir l'objet via 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
    }
3
paparazzo