WPF ListView с кнопками на каждой строке
У меня есть список Games
, который имеет только 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>
Чтобы использовать шаблон, я просто делаю это:
<ListBox ItemsSource="{Binding}"></ListBox>
Мне нужно добавить Button
к каждой строке в этом представлении списка с одним и тем же событием клика, но каким-то образом передаст идентификатор игры, для которой нажата кнопка.
Как я могу это сделать? Я застрял.
Если это не имеет смысла, дайте мне знать, и я попытаюсь объяснить лучше.
Ответы
Ответ 1
В первой части добавьте 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;
// ...
}
Ответ 2
Легко. Добавьте Button
в свой DataTemplate, дайте ему Command
, а затем установите CommandParameter="{Binding}"
. Объект DataContext в DataTemplate является объектом.
В соответствии с запросом некоторые ссылки на использование команд.
НТН,
Ответ 3
С 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
}