如何访问ListBox项目中的复选框

时间:2017-04-17 18:57:28

标签: c# wpf xaml checkbox listbox

我正在尝试使用复选框创建一个ListBox。

在xaml中我有:

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

我的ListBox看起来像:

enter image description here

没关系,但看看,当我选中“Municipales”时,未选中ListBox中的项目,当我在ListBox中选择“Industriales”时,它未被选中

如果我检查选择到ListBox中的项目,它与Checked

项目不一致
 foreach (var item in lstMaterial.SelectedItems)
 {
    MessageBox.Show(((MaterialesCL)item).DescCompuesta);
 }

它向我展示了“Oficiales”,“Industriales”和“Destrucciones”但是用户想要选择“Municipales”和“Destrucciones” 如果检查CheckBox是必需的,我如何使用CheckBox选中的ListBox项目重合?

4 个答案:

答案 0 :(得分:1)

XAML:
DescCompuestaListCheckListGeneric

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

这是您的CheckListGeneric班级

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
}

您可以使用简单查询选择所有内容

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

简单就像生活一样。

答案 1 :(得分:1)

如何将CheckBox IsChecked属性绑定到ListBoxItem IsSelected属性。 类似于:IsChecked={Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}

在你的例子中:

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

答案 2 :(得分:1)

对我来说,使用Blend制作模板总是最简单的方法。 在混合中打开项目并制作一个listBox,然后选择ListBox并添加如图片中的模板。 enter image description here

只是为了显示目的我添加了简单的checkBox和TextBlock,你可以像你一样喜欢它。

在ViewModel中我已经创建了简单的可观察集合,只是为了显示目的并将ItemsSource绑定到用户:

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

这样你可以制作任何你喜欢的模板。

答案 3 :(得分:0)

哇,我测试了你所有的建议,非常感谢你们,经过所有的测试,我需要的解决方案或多或少是这样的:

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

通过这种方式,我不关心点击的位置,项目将被选中或取消选中(在CheckBox和ListItem上)

并查看所选项目:

 // 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);
     }
 }

选择所有项目:

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

取消选择所有项目:

 // 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;
     }
 }

我的课程是:

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});
        }
    }
}

在我的UserControl MaterialesVM上是LstMaterialesCL的实例

 LstMaterialesCL MaterialesVM = new LstMaterialesCL();

因此我使用CheckBoxes对ListBox进行测试时可以正常工作。

感谢所有我学到的东西。

enter image description here