【问题标题】:WPF Click on control inside ListBoxItem does not select ListBoxItemWPF单击ListBoxItem内的控件不选择ListBoxItem
【发布时间】:2014-06-11 09:31:28
【问题描述】:

您好,我找不到任何类似的问题,所以我发布了新问题。在下面的代码中,我使用 ListBoxItems 创建 ListBox 控件,其中每个控件都包含单选按钮。当我单击单选按钮时,它会被选中,但父 ListBoxItem 不会(ListBoxItem 未突出显示)。我该如何解决这个问题?

<ListBox Margin="0, 5, 0, 0" ItemsSource="{Binding mySource, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <!-- Rabio template -->
            <RadioButton GroupName="radiosGroup"
                     Margin="10, 2, 5, 2"
                     Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.SelectedSetting}"
                     CommandParameter="{Binding SomeId, Mode=OneWay}"
                     Content="{Binding FileNameWithoutExtensions, Mode=OneWay}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

【问题讨论】:

    标签: c# wpf xaml mvvm wpf-controls


    【解决方案1】:

    您可以通过将以下ItemContainerStyle 应用于您的ListBox 来实现此目的,该Trigger 在属性IsKeyboardFocusWithin 上使用IsKeyboardFocusWithin 来选择它。

    <ListBox>
        <ListBox.ItemContainerStyle>
          <Style TargetType="ListBoxItem">
             <Style.Triggers> 
               <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
                  <Setter Property="IsSelected" Value="True"/> 
               </Trigger> 
             </Style.Triggers>
           </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
    

    【讨论】:

    • 这样做的一个问题是它会在失去键盘焦点时取消选择该项目。如果您有 Multi selectionMode,则不建议这样做。
    【解决方案2】:

    我有一个列表框,可以垂直、水平地显示ListBoxItems,并且每个ListBoxItem 中都包含各种子按钮。

    我遇到的问题(和其他人一样)是当您单击包含在ListBoxItem 中的子按钮时,ListBoxItem 未被选中并且您无法获得ListBoxItem.SelectedIndex 值(因为单击按钮不选择ListBoxItem)。

    我在实现上述 xaml 代码时遇到了一些问题,因为单击我的 GroupBox 标题会导致我选择的 ListBoxItem 失去焦点。

    我在网上找到的这个问题的最佳解决方案是在按钮的鼠标点击事件中添加几行代码来确定父控件,然后设置ListBoxItem.IsSelected = true

    完成此操作后,ListBoxItem.SelectedIndex 将包含所选项目的正确索引值。在我的代码中,DataContext 设置在 Listbox 上,如下所示:DataContext="{StaticResource VM_Programs}"

    这是按钮事件背后的 VB 代码:

    Private Sub YourButton_Click(sender As Object, e As RoutedEventArgs)
        Dim clicked As Object = (TryCast(e.OriginalSource, FrameworkElement)).DataContext
        Dim lbitem As ListBoxItem
        lbitem = YourListboxName.ItemContainerGenerator.ContainerFromItem(clicked)
        lbitem.IsSelected = True
        MsgBox("The listbox item (" + YourListboxName.SelectedIndex.ToString + ") is now selected")
    End Sub
    

    【讨论】:

    • 我相信这个问题与 C# 有关
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多