문제

항목에 확인란이 포함 된 목록 상자가 있습니다.

<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>

내가 가진 문제는 확인란이나 콘텐츠를 클릭하면 Parent ListBoxItem이 선택되지 않는다는 것입니다. 확인란 옆의 공백을 클릭하면 ListBoxItem이 선택됩니다.

내가 얻으려고하는 동작은 목록에서 하나 또는 많은 항목을 선택하고 SpaceBar를 사용하여 확인란을 켜고 끄는 것입니다.

더 많은 정보 :

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>

목록 상자에서 SpaceBar에 닿을 때 기본적으로 PreviewKeyDown을 사용해야했습니다. 가장 최근에 선택한 항목을 제외한 모든 것을 선택 해제합니다.

도움이 되었습니까?

해결책

우선, 내용을 바깥에 넣으십시오 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="..."/>

다른 팁

Checkbox의 등장한 속성과 ListBoxItem의 isselected 속성을 바인딩 할 수도 있습니다.

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

유스 케이스에서는 사용하는 것이 더 간단합니다. 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>

텍스트를 클릭하여 확인란 (기본 동작)을 확인할 수 있으며 이벤트 핸들러를 연결하지 않고도 키보드를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top