2

私はLINQが初めてです。WPF を使用するプロジェクトで使用したいと考えています。各wpfページに2つのリストボックスがあります(最初のwpfページにListBox1、2番目の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 
    }

2 番目の WPF ページ: ListBox2

public ScheduleOperation(List<FoodInformation> items)
        : this()
    {
        valueFromSelectionOperation = items;
        ListOfSelectedDinners.ItemsSource ;
        ListOfSelectedDinners.DisplayMemberPath = "Dinner";
    }

コーディングのお手伝いをいただければ幸いです。ありがとう!

4

2 に答える 2

1

後世の為に…

一般に、LINQ で何かを使用するには、IEnumerable が必要です。Items は ItemCollection で、SelectedItems は SelectedItemCollection です。それらは IEnumerable を実装していますが、IEnumerable は実装していません。これにより、あらゆる種類のものを 1 つの 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>();

アイテムから選択したアイテムを取得することは可能ですが、ListBoxItem を見つける必要があるため、努力する価値はありません (ここで説明されています: ListBox 内の ListBoxItem を取得します)。あなたはまだそれを行うことができますが、私はそれをお勧めします.

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 を返す可能性があることに注意してください。

于 2016-08-23T21:26:48.540 に答える
1

あなたの質問に対する私のコメントに加えて、次のようなことができます:

        var selectedFromProperty = ListBox1.SelectedItems;
        var selectedByLinq =  ListBox1.Items.Cast<ListBoxItem>().Where(x=>x.IsSelected);

リストボックス内のすべての項目が L​​istBoxItem タイプであることを確認してください。

于 2013-05-24T15:47:05.350 に答える