每行都有按钮的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。
我该怎么做?我被卡住了。如果你不明白,请告诉我,我会尽量更好地解释。
对于第一部分,向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>
在事件处理程序后面的代码中,您可以获得单击的Button
的DataContext
,并找出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
}