在 ListView 中处理按钮的单击命令
Handling Button's Click Command Inside ListView
假设我有一个简单的 ListView,在它的 Gridview 的唯一列中有一个按钮:
<ListView x:Name="SomeListView" ItemsSource="{Binding Whatever}">
<ListView.View>
<GridView>
<GridViewColumn CellTemplate="{StaticResource myCellTemplate}" Header="ColumnHeader"/>
</GridView>
</ListView.View>
</ListView>
而 myCellTemplate 看起来像这样:
<DataTemplate x:Key="myCellTemplate">
<Viewbox>
<Button x:Name="mybutton" Command="{Binding myClickCommand}" Content="{Binding btnBinding}"></Button>
</Viewbox>
</DataTemplate>
在我的 VM 中使用 myClickCommand 和 ICommand。此时,一切都很顺利,用户单击我的按钮将调用 myClickCommand,正如您所期望的那样。现在,我想向我的行添加一些鼠标悬停样式,因此我添加了一个 ItemContainerStyle,如下所示:
<ListView x:Name="SomeListView" ItemContainerStyle="{StaticResource myItemStyle}" ItemsSource="{Binding Whatever}">
...
</ListView>
myItemStyle 为:
<Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Grid>
<Border x:Name="borderMain" BorderThickness="1" BorderBrush="Transparent">
<GridViewRowPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<Rectangle x:Name="rectGlass" Fill="LightGray" Opacity=".2" Visibility="Hidden"></Rectangle>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="borderMain" Property="BorderBrush" Value="DarkGray" />
<Setter TargetName="rectGlass" Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
此时,用户的点击没有触发 myClickCommand,大概是因为事件没有路由到按钮。有什么办法可以做到这一点吗?
您的矩形 (rectGlass) 在按钮的顶部。该按钮没有收到点击事件,因为它从未真正被点击过。
假设我有一个简单的 ListView,在它的 Gridview 的唯一列中有一个按钮:
<ListView x:Name="SomeListView" ItemsSource="{Binding Whatever}">
<ListView.View>
<GridView>
<GridViewColumn CellTemplate="{StaticResource myCellTemplate}" Header="ColumnHeader"/>
</GridView>
</ListView.View>
</ListView>
而 myCellTemplate 看起来像这样:
<DataTemplate x:Key="myCellTemplate">
<Viewbox>
<Button x:Name="mybutton" Command="{Binding myClickCommand}" Content="{Binding btnBinding}"></Button>
</Viewbox>
</DataTemplate>
在我的 VM 中使用 myClickCommand 和 ICommand。此时,一切都很顺利,用户单击我的按钮将调用 myClickCommand,正如您所期望的那样。现在,我想向我的行添加一些鼠标悬停样式,因此我添加了一个 ItemContainerStyle,如下所示:
<ListView x:Name="SomeListView" ItemContainerStyle="{StaticResource myItemStyle}" ItemsSource="{Binding Whatever}">
...
</ListView>
myItemStyle 为:
<Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Grid>
<Border x:Name="borderMain" BorderThickness="1" BorderBrush="Transparent">
<GridViewRowPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<Rectangle x:Name="rectGlass" Fill="LightGray" Opacity=".2" Visibility="Hidden"></Rectangle>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="borderMain" Property="BorderBrush" Value="DarkGray" />
<Setter TargetName="rectGlass" Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
此时,用户的点击没有触发 myClickCommand,大概是因为事件没有路由到按钮。有什么办法可以做到这一点吗?
您的矩形 (rectGlass) 在按钮的顶部。该按钮没有收到点击事件,因为它从未真正被点击过。