每行都有按钮的WPF ListView

本文关键字:WPF ListView 按钮 | 更新日期: 2023-09-27 18:06:23

我有一个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到具有相同点击事件的每行,但将以某种方式传递被点击按钮的游戏ID。

我该怎么做?我被卡住了。如果你不明白,请告诉我,我会尽量更好地解释。

每行都有按钮的WPF ListView

对于第一部分,向DataTemplate添加Button并订阅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>

在事件处理程序后面的代码中,您可以获得单击的ButtonDataContext,并找出Id,如

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

很容易。将Button添加到DataTemplate,给它一个Command,然后设置CommandParameter="{Binding}"。DataTemplate中的DataContext是对象。

根据请求,提供了一些使用命令的链接。

  • WPF命令第1部分:基础WPF命令第2部分:命令绑定和手势
  • MSDN理解WPF中的路由事件和命令(ADVANCED)

HTH,

与ListBox.ItemTemplate。然后在点击事件中,你可以通过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
    }