WPF ListView每行都有按钮

twa*_*ron 22 c# wpf xaml listview datatemplate

我有一个列表,Games其中只有a ID,a Date和a 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>
Run Code Online (Sandbox Code Playgroud)

要使用模板,我只是这样做:

    <ListBox ItemsSource="{Binding}"></ListBox>    
Run Code Online (Sandbox Code Playgroud)

我需要Button在此列表视图中的每一行添加一个具有相同点击事件的行,但会以某种方式传递点击该按钮的游戏的ID.

我怎样才能做到这一点?我被卡住了.如果它没有意义让我知道,我会尝试更好地解释.

Fre*_*lad 44

在第一部分中,添加一个ButtonDataTemplate并订阅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>
Run Code Online (Sandbox Code Playgroud)

在事件处理程序后面的代码中,您可以获取DataContext单击的内容Button并找出ID之类的内容

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


Den*_*nis 16

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

根据要求,一些指向使用命令的链接.

HTH,

  • 这是一个更整洁的解决方案.由于我一直在编写MVVM代码,我甚至认为在代码后面使用事件处理程序(即*xaml.cs*).它真是太好了. (3认同)