列表框多重选择通过代码c#在WPF

本文关键字:代码 WPF 选择 列表 | 更新日期: 2023-09-27 18:05:55

这是我的程序的一部分,我有一个sql字符串和一个列表框,我想在列表框中选择那些存在于字符串中的项目。

但问题是:只有最后一个项目将被我的代码选中!

此外,我使用WPF . net 4.5,没有ListboxItem。选择属性还有listBox1.GetItemText!

MYlistbox.SelectionMode=SelectionMode.Multiple;
foreach (var item in MYlistbox.items)
{
 If(Mystring.Contains(item.ToString()))
  {
   MYlistbox.SelectedValue=item.ToString(); 
  }
} 

列表框多重选择通过代码c#在WPF

Items集合中的项目是项目数据,而不是ListBoxItem,您应该使用ItemContainerGenerator来获取ListBoxItem容器,并使用IsSelected属性:

foreach (var item in MYlistbox.items){
   if(Mystring.Contains(item.ToString())) {
       var lbItem = MYlistbox.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
       if(lbItem != null){
           lbItem.IsSelected = true;
       }
   }
} 

还要注意,ItemContainerGenerator只在项目被加载和呈现时才起作用。遗憾的是,ListBox也默认使用VirtualizingStackPanel。因此,代码片段仅适用于可见项(隐藏项不会呈现任何容器)。如果您的列表框不包含大的集合,可能不需要虚拟化,那么您可以像这样禁用虚拟化:

VirtualizingStackPanel.SetIsVirtualizing(MYlistbox, false);
MYlistbox.UpdateLayout();//this is very important

如果继续使用虚拟化,我认为你必须以某种方式绑定IsSelected到你的viewModel使用绑定与一些转换器。这种方法更复杂,但对MVVM更友好(如果您熟悉MVVM,应该这样做)。

for (int i=0, i< MYlistbox.Items.Count;i++)
{
   if(Mystring.Contains(MYlistbox.Items[i].ToString()))
     {
       MYlistbox.SelectedItems.Add.(MYlistbox.Items[i]);
     }
 }