我是 LINQ 新手。我想在我的 WPF 项目中使用它。我每个 wpf 页面有两个 listBox(第一个 wpf 页面中的 ListBox1 和第二个 wpf 页面中的 ListBox2)。我需要将选定的值从 ListBox1 传递到 ListBox2。
第一个 WPF 页面:ListBox1
private void btnNext_Click(object sender, RoutedEventArgs e)
{
List<FoodInformation> _dinners = (from ListItem item in ListOfFood.Items
where item.selecteditem select item).ToList();
//(above: this linq - item.SelectedItems doesnt work. How?)
var passValue = new ScheduleOperation(_dinners);
Switcher.Switch(passValue); //go to another page
}
第二个WPF页面:ListBox2
public ScheduleOperation(List<FoodInformation> items)
: this()
{
valueFromSelectionOperation = items;
ListOfSelectedDinners.ItemsSource ;
ListOfSelectedDinners.DisplayMemberPath = "Dinner";
}
我们将非常感谢您在编码方面的帮助。谢谢!
除了我对您的问题的评论之外,您还可以执行以下操作:
var selectedFromProperty = ListBox1.SelectedItems;
var selectedByLinq = ListBox1.Items.Cast<ListBoxItem>().Where(x=>x.IsSelected);
只需确保列表框中的每个项目都是 ListBoxItem 类型即可。
为了子孙后代...
一般来说,要在 LINQ 中使用某些东西,您需要一个
IEnumerable<T>
。 Items 是一个 ItemCollection,SelectedItems 是一个 SelectedItemCollection。他们实现了 IEnumerable
,但没有实现 IEnumerable<T>
。这允许将各种不同的东西放入一个列表框中。
如果您没有明确地将 ListBoxItems 放入列表中,则需要强制转换为实际放入列表中的项目的类型。
例如,使用 XAML 的字符串:
<ListBox Height="200" SelectionMode="Multiple" x:Name="ListBox1">
<system:String>1</system:String>
<system:String>2</system:String>
<system:String>3</system:String>
<system:String>4</system:String>
</ListBox>
或使用 C#:
ListBox1.ItemsSource = new List<string> {"1", "2", "3", "4"};
ListBox1.SelectedItems 需要转换为字符串:
var selectedFromProperty = ListBox1.SelectedItems.Cast<string>();
或者,如果您只关心给定类型的项目,则可以使用
OfType<T>
来枚举可分配给类型 T
的项目,如下所示:
var selectedFromProperty = ListBox1.SelectedItems.OfType<string>();
虽然可以从 Items 中获取所选项目,但这确实不值得,因为您必须找到 ListBoxItem(此处说明:在 ListBox 中获取 ListBoxItem)。你仍然可以这样做,但我不推荐这样做。一般来说,使用 MVVM 和 XAML 会更好。
var selectedByLinq = ListBox1.Items
.Cast<string>()
.Select(s => Tuple.Create(s, ListBox1.ItemContainerGenerator
.ContainerFromItem(s) as ListBoxItem))
.Where(t => t.Item2.IsSelected)
.Select(t => t.Item1);
请注意,ListBox 默认为虚拟化,因此 ContainerFromItem 可能返回 null。