列表框选择已更改,无法在其项模板中使用按钮
本文关键字:按钮 选择 列表 | 更新日期: 2023-09-27 18:32:28
当我在列表框中选择项目时,下面的代码不起作用,你知道为什么吗?
<ListBox BorderBrush="Transparent" Background="Transparent" Name="listbox" HorizontalAlignment="Center" VerticalAlignment="Center" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="selection_changed">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Button Height="90" Width="150" Template="{StaticResource cbutton}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
模板按钮看起来像这样
<ControlTemplate x:Key="cbutton" TargetType="Button">
<Border CornerRadius="3" BorderThickness="3.5" BorderBrush="White">
<Border.Background>
<LinearGradientBrush EndPoint="1,1" StartPoint="0,0">
<GradientStop Color="DarkOrange" Offset="0.1"/>
<GradientStop Color="Orange" Offset="0.85"/>
</LinearGradientBrush>
</Border.Background>
<TextBlock FontWeight="ExtraBold" Foreground="White" TextAlignment="Center" TextWrapping="Wrap" FontSize="15" Text="{Binding name}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</ControlTemplate>
不会触发 SelectionChanged
事件,因为按钮是捕获鼠标单击的控件,而不是ListBox
。
可以改为将事件处理程序设置为按钮的单击事件。
<Button Height="90" Width="150" Click="myClickEventHandler"/>
无论如何,我建议您使用 MVVM,而不是代码隐藏事件处理程序。
您可以设置一个命令,该命令将在单击按钮时触发,并将命令发送到按钮的内容,例如
<Button Name="myButton" Height="90" Width="150" Template="{StaticResource cbutton}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding DoSomething}" CommandParameter="{Binding ElementName=myButton, Path=Content}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
视图模型
DoSomething = new DelegateCommand<object>(content=>
{
// Do whatever you want
});
如果您不熟悉 MVVM,学习它需要一些时间,但这绝对值得:)
可以在 ListBoxItem 上添加 PreviewMouseDown 事件处理程序:
<ListBox ItemsSource="{Binding ListBoxItemsSource}">
<ListBox.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewMouseDown"
Handler="ItemOnPreviewMouseDown" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
private void ItemOnPreviewMouseDown(
object sender, MouseButtonEventArgs e)
{
((ListBoxItem) sender).IsSelected = true;
}