点击列表框

本文关键字:列表 | 更新日期: 2023-09-27 18:06:47

我有listboxitem的模板。模板包含复选框。总是,当我检查它时,Tap事件被触发。但是Tap只有在我选择项目时才会触发,而在我选中复选框时则不会。我试图使用SelctionChanged事件,这是正常工作。但我想使用交互,因为mvvm模式。这是我的xaml代码。

<ListBox x:Name="lstboxDevicePositions" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding DevicePositions}" SelectedIndex="{Binding SelectedIndexDevicePosition, Mode=TwoWay}" SelectedItem="{Binding SelectedDevicePosition, Mode=TwoWay}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Background="#709DFF" Margin="1,0,1,2" CornerRadius="2" >
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <CheckBox x:Name="cbxSelected" Grid.Column="0" Grid.RowSpan="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" IsChecked="{Binding IsSelected, Mode=TwoWay}" />
                            <TextBlock x:Name="txtblockBindedAddress" Grid.Column="1" Grid.Row="0" TextWrapping="Wrap" Text="{Binding Address}" />
                            <TextBlock x:Name="txtblockBindedDate" Grid.Column="1" Grid.Row="1" Text="{Binding Date}" />
                        </Grid>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListBox.ItemContainerStyle>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Tap">
                    <cmd:EventToCommand Command="{Binding ShowDevicePositionCommand}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ListBox>

编辑

问题是,复选框和列表框有Tap事件。当我点击复选框事件被触发。我想只在点击listboxitem时触发Tap事件。

点击列表框

听起来你只需要停止复选框处理鼠标/手势事件。只需将复选框上的IsHitTestVisible设置为False。

<CheckBox x:Name="cbxSelected" 
          Grid.Column="0" 
          Grid.RowSpan="2" 
          VerticalAlignment="Stretch" 
          HorizontalAlignment="Stretch" 
          IsChecked="{Binding IsSelected, Mode=TwoWay}"
          IsHitTestVisible="False"/>
罢工

我现在意识到我误解了你的问题。

如果您希望能够选中复选框而不导致ListBoxItem被选中,则应该处理复选框中的Tap事件。

<CheckBox x:Name="cbxSelected" 
          Tap="cbxSelected_Tap"
          ...
          />

private void cbxSelected_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    e.Handled = true;
}

通过设置Handled = true,您将阻止事件被路由到ListBoxItem。