19

アイテムにチェックボックスが含まれるリストボックスがあります。

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

私が抱えている問題は、チェックボックスまたはその内容をクリックすると、親の ListBoxItem が選択されないことです。チェックボックスの横にある空白をクリックすると、ListBoxItem が選択されます。

私が取得しようとしている動作は、リスト内の 1 つまたは複数の項目を選択し、スペースバーを使用してチェックボックスのオンとオフを切り替えることです。

いくつかの詳細情報:

private void Checkbox_Click(object sender, RoutedEventArgs e)
{
    CheckBox chkBox = e.OriginalSource as CheckBox;
}

上記のコードでチェックボックスをクリックすると、e.Handled は false で、chkBox.Parent は null になります。

ケントの答えは私を正しい道に導きました。これが私が最終的に得たものです:

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox" PreviewKeyDown="ListBox_PreviewKeyDown">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" />
                <TextBlock Text="{Binding DisplayText}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

デフォルトでは、リスト ボックスでスペースバーを押すと、最後に選択した項目以外のすべてが選択解除されるため、PreviewKeyDown を使用する必要がありました。

4

3 に答える 3

10

まず、コンテンツを の外側に置きますCheckBox

<StackPanel Orientation="Horizontal">
    <CheckBox IsChecked="{Binding IsChecked}"/>
    <TextBlock Text="{Binding DisplayText}"/>
</StackPanel>

その後、スペースを押すとチェックされるListBoxItemようにする必要があります。CheckBoxの単純なイベント ハンドラなど、これを行う方法はいくつかありますListBoxItem。または、のハンドラーを指定することもできUIElement.KeyUpますDataTemplate

<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/>
于 2008-09-24T14:42:04.303 に答える
3

ItemsControlあなたのユースケースでは、リストボックスの代わりにを使用する方が簡単です。ItemsControl は、自動選択動作が含まれていないことを除いて、Listbox に似ています。つまり、本質的にチェックボックスであるもののリストをホストするためにそれを使用することは非常に簡単であり、ListBox の選択動作を回避する必要はありません。

ItemsControl に切り替えるだけで、まさに必要なものが得られます。

<ItemsControl Style="{StaticResource CheckBoxListStyle}" Name="EditListBox">
    <ItemsControl .ItemTemplate>
        <DataTemplate>
            <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

テキストをクリックしてチェックボックスをオンにすることができ (デフォルトの動作)、イベント ハンドラーを接続することなくキーボードを使用することもできます。

于 2011-10-19T06:12:33.180 に答える
3

CheckBox の IsChecked プロパティと ListBoxItem の IsSelected プロパティをバインドすることもできます。

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
于 2008-09-25T14:56:37.113 に答える