WPF ListView每行都有按钮

时间:2011-08-19 22:08:06

标签: c# wpf xaml listview datatemplate

我有一个Games列表,其中只有IDDateTime。 我将此列表设置为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。

我该怎么做?我被卡住了。 如果它没有意义让我知道,我会尝试更好地解释。

3 个答案:

答案 0 :(得分:43)

对于第一部分,向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的{​​{1}}并找出ID

Button

答案 1 :(得分:16)

容易。在 DataTemplate 中添加Button,为其指定Command,然后设置CommandParameter="{Binding}"。 DataTemplate中的 DataContext 是对象。

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

HTH,

答案 2 :(得分:3)

使用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
    }
相关问题