WPF ListView с кнопками в каждой строке - PullRequest
22 голосов
/ 20 августа 2011

У меня есть список Games, в котором есть ID, Date и Time.Я устанавливаю этот список как DataContext.

У меня тогда есть DataTemplate для этих игр:

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

Чтобы использовать шаблон, я просто делаю это:

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

Мне нужно добавить Button к каждой строке в этом представлении списка, в которой есть одно и то же событие щелчка, но каким-то образом передается идентификатор игры, для которой нажимается кнопка.*

Как я могу это сделать?Я застрял.Если это не имеет смысла, дайте мне знать, и я постараюсь объяснить лучше.

Ответы [ 3 ]

43 голосов
/ 20 августа 2011

Для первой части добавьте Button к DataTemplate и подпишитесь на событие 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>

. В коде обработчика событий вы можете получить DataContextнажал Button и узнать идентификатор как

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    Game game = button.DataContext as Game;
    int id = game.ID;
    // ...
}
16 голосов
/ 20 августа 2011

Легко. Добавьте Button к вашему DataTemplate , присвойте ему Command и затем установите CommandParameter="{Binding}". DataContext в DataTemplate является объектом.

По запросу некоторые ссылки на использование команд.

НТН,

3 голосов
/ 20 августа 2011

С помощью ListBox.ItemTemplate. Затем в вашем событии click вы можете получить объект через 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
    }
...