1

我有以下列表框:

<ListBox ItemsSource="{Binding AvailableTemplates}" Style="{DynamicResource SearchListBoxStyle}" SelectedItem="{Binding SelectedTemplate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <RadioButton Content="{Binding}" GroupName="group" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

如果我在单选按钮上选择,这不会检测到所选项目已更改。它只检测我是否单击列表框行上的单选按钮。单击单选按钮时如何修改以检测所选项目已更改的任何想法?

4

3 回答 3

8

如果只想同步RadioButton.IsCheckedwith ListBoxItem.IsSelected,可以使用绑定

<RadioButton Content="{Binding}" GroupName="group"
             IsChecked="{Binding Path=IsSelected, RelativeSource={
                 RelativeSource AncestorType={x:Type ListBoxItem}},Mode=TwoWay}"/>

如果您不希望您的项目同步,您可以在项目获得键盘焦点时使用Trigger设置IsSelected,尽管这只会在项目具有键盘焦点时保持选中状态

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

而且,如果无论元素是否仍然具有键盘焦点,都希望它被选中,则必须在后面使用一些代码

<Style TargetType="{x:Type ListBoxItem}">
    <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>
protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
    ListBoxItem item = (ListBoxItem)sender;
    item.IsSelected = true;
}
于 2012-06-28T14:19:56.497 回答
1

你不能弄错:listBox.SelectedItem 和 radioButton.IsChecked

它们是完全不同的东西,SelectedItem 被称为 ListBoxItem,你的单选按钮在一个 listboxitem 中。

您必须对属性 IsChecked (RadioButton) 进行绑定。

于 2012-06-28T14:11:55.943 回答
1

尝试设置ListBoxItem.IsHitTestVisible为 false(您可以在 xaml 中执行此操作)。它基本解决了我的选择问题。我的问题是,只有当我单击 ListBox 行中的空白而不是自定义内容时,选择才有效。

于 2013-02-01T08:27:22.147 回答