2008-09-24 13 views
18

मैं एक लिस्टबॉक्स जहां आइटम चेक बॉक्स शामिल है:WPF ListBoxItem चयन समस्या

<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 उपयोग करने के लिए है क्योंकि डिफ़ॉल्ट रूप से जब आप एक सूची बॉक्स में स्पेस बार हिट बना, यह के अलावा सब कुछ deselects सबसे हाल ही में चयनित आइटम।

उत्तर

10

, सबसे पहले CheckBox बाहर सामग्री डाल: उसके बाद

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

, आप एक ListBoxItem परिणाम CheckBox में पर कि दबाने अंतरिक्ष सुनिश्चित करने के लिए जाँच की जा रही की आवश्यकता होगी। ऐसा करने के कई तरीके हैं, जिनमें ListBoxItem पर एक साधारण ईवेंट हैंडलर शामिल है। या फिर आप अपने DataTemplate में UIElement.KeyUp या जो कुछ भी के लिए कोई हैंडलर निर्दिष्ट कर सकते हैं:

<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/> 
3

तुम भी चेकबॉक्स चुनकर ListBoxItem की IsSelected संपत्ति के IsChecked संपत्ति बाध्य कर सकते हैं:

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

जिस तरह से मैंने इसे पहले किया था। दोष यह है कि चेकबॉक्स राज्य सूची नियंत्रण चयन स्थिति से बंधे हैं, जो चेकबॉक्स वाले सूची नियंत्रण के लिए सामान्य व्यवहार नहीं है। –

2

आपके उपयोग के मामले में यह एक सूची बॉक्स के बजाय ItemsControl का उपयोग करने के लिए आसान तरीका होगा। एक आइटम नियंत्रण एक सूची बॉक्स के समान है सिवाय इसके कि इसमें स्वचालित चयन व्यवहार नहीं है। जिसका अर्थ है कि अनिवार्य रूप से चेकबॉक्स की सूची होस्ट करने के लिए इसका उपयोग करना बहुत आसान है और आपको 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> 

आप पाठ पर क्लिक कर सकते हैं चेक बॉक्स (डिफ़ॉल्ट व्यवहार) की जाँच करने के लिए और आप किसी भी घटना संचालकों ऊपर तार के बिना कुंजीपटल भी उपयोग कर सकते हैं ।