2016-06-06 20 views
-1

Ich habe so ein listbox wie unten Checkbox in listbox setzen:wie für bestimmte Artikel in listbox C# WPF

<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="385" Margin="21,138,0,0" VerticalAlignment="Top" Width="273" ItemsSource="{Binding Path=locationList}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Button Name="btnDelete" Click="btnDelete_Click" Width="15" Height="15" HorizontalAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Content="x" /> 
        <CheckBox Name="checkBox" /> 
        <TextBlock Name="textBox" Text="{Binding}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Und was ich tun möchte ist gesetzt Checkbox für bestimmte Artikel dieser listbox.

Ich versuche, es zu tun:

private void button4_Click(object sender, RoutedEventArgs e) 
    { 
     for(int i = 0; i < listBox.Items.Count; i++) 
     { 
      listBox.Items[i].checkBox = false; 
     } 
    } 

Ich weiß, dass ich einen Fehler mache. Ich möchte es in Objekt des Elements umwandeln und dann die Eigenschaft eines Elements (dieses Kontrollkästchen) auf false setzen. Darf mich jemand korrigieren? Vielen Dank im Voraus.

bearbeiten:

Bevor ich versuchte, es auf diese Weise zu tun:

 foreach (var item in listBox.SelectedItems) 
     { 
      item. 
     } 

aber alle Möglichkeiten, die ich bekommen haben sind nur Standardmethoden: Gleich, GetHashCode, GetType, ToString ... Wie kann ich auf die Checkbox verweisen?

Darüber hinaus werde ich meine Frage mit der Einsicht liefern. Ich möchte einen bestimmten Artikel nach Text suchen, der in der Listbox (Artikel) steht und dann das Kontrollkästchen für diesen Artikel ändern (gleiche Zeile in Listbox). Die zweite zu implementierende Logik besteht darin, alle Zeilen auf ausgewählt oder nicht ausgewählt zu setzen (das ist es, was ich jetzt versuche).

Vielen Dank für Ihre Antwort.

+0

ListBox sollten Sie ändern für Schleife zu foreach zum Beispiel 'foreach (var Element in listBox.SelectedItems)' etwas wie das .. – MethodMan

+0

Vielen Dank für die Zeit :) Ich habe Post als Antwort für Sie bearbeitet. –

+0

http://www.c-sharpcorner.com/forums/how-to-uncheck-checked-items-in-a-checkedlistbox – MethodMan

Antwort

3
 for (int i = 0; i < listBox.Items.Count; i++) 
     { 
      var item = listBox.ItemContainerGenerator.ContainerFromItem(listBox.Items[i]) as ListBoxItem; 
      var template = item.ContentTemplate as DataTemplate; 

      ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(item); 

      CheckBox myCheckBox = (CheckBox)template.FindName("checkBox", myContentPresenter); 

      myCheckBox.IsChecked = true; 
     } 

Ebenso können Sie den Textblock mit finden (beachten Sie, genannt Sie es "textBox" not "textblock")

  TextBlock myTextBlock = (TextBlock)template.FindName("textBox", myContentPresenter); 

FindVisualChild finden Sie hier FindVisualChild reference issue

+0

Hey, das funktioniert wie ein Charme :) Bis 21. Element, das immer Fehler der Nachricht verursacht: "Objektreferenz ist nicht auf eine Instanz eines Objekts festgelegt.". Als meine itemSource habe ich Liste . Das 21-Item ist nicht besonders, hat keine Sonderzeichen oder irgendetwas. Was ich denke, um ein kleines Modell dafür zu schreiben, eine Klasse, die meine Schnur und bool enthält oder es als List > macht. Übrigens, haben Sie eine Idee, warum diese Ausnahme auftritt? Dein Vorschlag ist trotzdem großartig. Es erklärt mir etwas WPF-Komplexität. –

+1

@jankowalski Das Problem ist der 21. Artikel wurde nicht erstellt. Sie können bewirken, dass es erstellt wird, indem Sie zum letzten Element scrollen. Oder fügen Sie das zu Ihrem ListBox VirtualizingPanel.IsVirtualizing = "False" hinzu. – user2880486

+0

Ich bin beeindruckt von Ihrem Wissen über WPF. Ich wünsche dir alles Gute, Mann.Vielen Dank, dass Sie mir geholfen haben, diese Probleme zu lösen. –