سؤال

لدي مربع قائمة حيث تحتوي العناصر على مربعات اختيار:

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

السلوك الذي أحاول الحصول عليه هو أن أتمكن من تحديد عنصر واحد أو أكثر في القائمة واستخدام شريط المسافة للتبديل بين تشغيل مربعات الاختيار وإيقاف تشغيلها.

بعض المعلومات الإضافية:

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

في الكود أعلاه عندما أنقر فوق مربع الاختيار، يكون e.Handled خطأ وchkBox.Parent فارغًا.

لقد وضعتني إجابة كينت على الطريق الصحيح، وإليك ما انتهى بي الأمر إليه:

<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 لأنه بشكل افتراضي، عندما تضغط على مفتاح المسافة في مربع القائمة، فإنه يلغي تحديد كل شيء باستثناء العنصر المحدد مؤخرًا.

هل كانت مفيدة؟

المحلول

للبدء، ضع المحتوى خارج الملف 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="..."/>

نصائح أخرى

يمكنك أيضًا ربط الخاصية IsChecked الخاصة بـ CheckBox والخاصية IsSelected الخاصة بـ ListBoxItem:

<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