2017-04-17 2 views
0

Ich versuche, eine ListBox mit Kontrollkästchen darin zu machen.Wie auf Kontrollkästchen in ListBox-Elementen zugreifen

in XAML ich habe:

<ListBox ItemsSource="{StaticResource ResourceKey=lstMaterialesCL}" SelectionMode="Multiple" Name="lstMaterial" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Name="chkMaterial" Content="{Binding DescCompuesta}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

und meine ListBox sieht aus, als:

enter image description here

Es ist in Ordnung, aber schauen Sie es, wenn ich "Municipales" das Element in der List-Box überprüft ist nicht ausgewählt, und wenn ich in der ListBox "Industriales" auswähle, wird es nicht überprüft

Wenn ich die in der ListBox ausgewählten Elemente überprüfe, stimmen sie nicht überein w ith den Artikel

Karo
foreach (var item in lstMaterial.SelectedItems) 
{ 
    MessageBox.Show(((MaterialesCL)item).DescCompuesta); 
} 

Es zeigt mir, „Oficiales“, „Industriales“ und „Destrucciones“ aber der Benutzer wurde wählenden „Municipales“ und „Destrucciones“ Wie ich kann, um die List-Box Artikel übereinstimmen ausgewählt mit Das Kontrollkästchen hat geprüft, ob das CheckBox-Kontrollkästchen obligatorisch ist.

+0

http://stackoverflow.com/questions/21193242/wpf-checkedlistbox-how-to-get-selected-item –

+0

http://stackoverflow.com/questions/21193242/wpf-checkedlistbox- how-to-get-selected-item –

+0

Überprüfen Sie diese Post. Ich hoffe, Sie werden anwser bekommen. –

Antwort

1

XAML:
DescCompuestaList ist eine Liste von CheckListGeneric

<ListBox ItemsSource="{Binding DescCompuestaList}" > 
    <ListBox.ItemTemplate> 
     <HierarchicalDataTemplate> 
      <CheckBox Content="{Binding DescCompuesta}" IsChecked="{Binding IsChecked}"/> 
     </HierarchicalDataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Hier Ihre CheckListGeneric Klasse

public class CheckListGeneric: ViewModelBase 
{ 
    #region ..:: Fields ::.. 

    private bool _isChecked; 

    #endregion 

    #region ..:: Properties ::.. 

    public long Id { get; set; } 
    public string DescCompuesta{ get; set; } 

    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set { _isChecked = value; OnPropertyChanged("IsChecked"); } 
    } 

    #endregion 
} 

Sie können alle mit einer einfachen Abfrage ausgewählt bekommen

var selectedItems = DescCompuestaList.Where(x => x.IsChecked)

einfach wie das Leben.

+0

thnks so viel @ CelsoLívero Ich testet Sie Vorschlag – Cyndy

1

Wie wäre es mit der Bindung CheckBox 's IsChecked Eigenschaft an ListBoxItem' s IsSelected Eigenschaft. Etwas wie: IsChecked={Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}

In Ihrem Beispiel:

<ListBox ItemsSource="{StaticResource ResourceKey=lstMaterialesCL}" SelectionMode="Multiple" Name="lstMaterial" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Name="chkMaterial" Content="{Binding DescCompuesta}" IsChecked={Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

thnks so viel @Bubba Ich testet Sie Vorschlag – Cyndy

+0

Wenn es Ihnen hilft, vergessen Sie nicht, up-vote und die Antwort zu akzeptieren. – Bubba

1

Für mich ist es immer einfachste Weg Mischung zu verwenden Vorlagen für die Herstellung. Öffnen Sie das Projekt in Blend und machen Sie ein listBox, dann wählen Sie diese ListBox und fügen Sie die Vorlage wie im Bild.

nur um den Zweck zu zeigen, ich habe hinzufügen, einfache CheckBox und TextBlock, und Sie können es so machen, wie Sie es mögen.

in Ansichtsmodell i einfach beobachtbaren Sammlung gemacht haben nur Zweck und gebunden Itemssource an Benutzer zu zeigen:

public class TestVM 
    { 
     public ObservableCollection<User> Users { get; set; } 

     public TestVM() 
     { 
      Users = new ObservableCollection<User> 
      { 
       new User{ IsChecked=true, Name="User1" }, 
       new User{ IsChecked=false, Name="User2" }, 
       new User{ IsChecked=true, Name="User3" }, 
       new User{ IsChecked=false, Name="User3" }, 
      }; 
     } 
    } 

    public class User 
    { 
     public bool IsChecked { get; set; } 
     public string Name { get; set; } 
    } 

diese Weise können Sie jede Vorlage machen, die Sie mögen.

0

Wow, ich getestet alle Ihre Vorschläge, vielen Dank an alle, nach allen Tests, die Lösung, wie ich brauche es mehr oder weniger wie folgt aus:

Auf XAML:

<StackPanel Orientation="Horizontal"> 
    <ListBox ItemsSource="{Binding MaterialesVM}" SelectionMode="Multiple" 
Name="ListBoxMateriales" Width="300" Height="200" 
HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="IsSelected" Value="{Binding IsChecked, Mode=TwoWay}" /> 
      </Style> 
     </ListBox.ItemContainerStyle> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" 
Content="{Binding DescCompuesta}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <Button Name="btnPrueba" Style="{StaticResource BotonContent}" 
Content="Selected" Width="80" Height="30" HorizontalAlignment="Left" 
VerticalAlignment="Top" 
      Margin="10,0,0,0" Click="btnPrueba_Click"/> 
    <Button Name="btnLimpia" Style="{StaticResource BotonRechazar}" 
Width="30" Height="30" Click="btnLimpia_Click" HorizontalAlignment="Left" 
VerticalAlignment="Top" 
      Margin="5,0,0,0" ToolTipService.ToolTip="Limpia Todos"/> 
    <Button Name="btnMarca" Style="{StaticResource BotonAceptar}" 
Width="30" Height="30" Click="btnMarca_Click" HorizontalAlignment="Left" 
VerticalAlignment="Top" 
      Margin="5,0,0,0" ToolTipService.ToolTip="Selecciona Todos"/> 
</StackPanel> 

// To show the selected items 
private void btnPrueba_Click(object sender, RoutedEventArgs e) 
{ 
    var selectedItems = MaterialesVM.Where(x => x.IsChecked); 
    foreach (var item in selectedItems) 
    { 
     MessageBox.Show(((MaterialesCL)item).DescCompuesta); 
    } 
} 
01: auf diese Art und Weise auf mich egal, wo geklickt hat, wird das Element (auf der CheckBox und auf dem ListItem)

und um zu sehen, die Elemente ausgewählt oder unver ausgewählt werden

Um alle Elemente auszuwählen:

// To select all items 
private void btnMarca_Click(object sender, RoutedEventArgs e) 
{ 
    var Items = ListBoxMateriales.Items; 
    foreach (MaterialesCL item in Items) 
    { 
     item.IsChecked = true; 
    } 
} 

Um alle Elemente un-wählen:

// To un-select all items 
private void btnLimpia_Click(object sender, RoutedEventArgs e) 
{ 
    var Items = ListBoxMateriales.Items; 
    foreach (MaterialesCL item in Items) 
    { 
     item.IsChecked = false; 
    } 
} 

und meine Klassen sind:

MaterialesCL.cs

public class MaterialesCL : INotifyPropertyChanged 
{ 
    public int Material { get; set; } 
    public string Descripcion { get; set; } 
    public string DescCompuesta { get; set; } 
    private bool _ischecked; 
    public bool IsChecked 
    { 
     get { return _ischecked; } 
     set 
     { 
      _ischecked = value; 
      OnPropertyChanged("IsChecked"); 
     } 
    } 

    #region PropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 

LstMaterialesCL. cs

public class LstMaterialesCL : ObservableCollection<MaterialesCL>, INotifyPropertyChanged 
{ 
    public LstMaterialesCL() 
    { 
     BasculaEntities _context = new BasculaEntities(); 
     var Query = (from m in _context.Materiales 
         select new { m.Material, m.Descripcion} 
         ).OrderBy(m => m.Material).ToList(); 

     foreach (var item in Query) 
     { 
      this.Add(new MaterialesCL { Material = item.Material, 
       Descripcion = item.Descripcion, DescCompuesta = item.Material.ToString("000") + " - " + item.Descripcion, 
      IsChecked=false}); 
     } 
    } 
} 

und auf meinem Usercontrol MaterialesVM ist eine Instanz LstMaterialesCL

LstMaterialesCL MaterialesVM = new LstMaterialesCL(); 

und so mein Test von List-Box mit Checkboxen funktioniert wie ich brauche.

Vielen Dank an alle, die ich so viel gelernt habe.

enter image description here

Verwandte Themen