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.IsCheckedとのみ同期したい場合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

false に設定ListBoxItem.IsHitTestVisibleしてみてください (xaml でこれを行うことができます)。それは私の選択問題の初歩を解決しました。私の問題は、リストボックス行の空白をクリックしたときにのみ選択が機能し、カスタムコンテンツでは機能しなかったことです。

于 2013-02-01T08:27:22.147 に答える