我是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";
}
我非常感谢您对编码的帮助。谢谢!
答案 0 :(得分:0)
除了我对你的问题的评论,你可以这样做:
var selectedFromProperty = ListBox1.SelectedItems;
var selectedByLinq = ListBox1.Items.Cast<ListBoxItem>().Where(x=>x.IsSelected);
只需确保列表框中的每个项目都是ListBoxItem类型。
答案 1 :(得分:0)
为了后人......
通常,要使用LINQ的东西,你需要一个IEnumerable。 Items是ItemCollection,SelectedItems是SelectedItemCollection。它们实现IEnumerable,但不是IEnumerable。这允许将各种不同的东西放在一个ListBox中。
如果您没有将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#:randomListBox.ItemsSource = new List<string> {"1", "2", "3", "4"};
ListBox1.SelectedItems需要转换为字符串:
var selectedFromProperty = ListBox1.SelectedItems.Cast<string>();
虽然可以从Items中获取所选项目,但实际上不值得付出努力,因为您必须找到ListBoxItem(在此处解释:Get the ListBoxItem in a ListBox)。你仍然可以这样做,但我推荐它。
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。