C# 更改绑定列表框中项目的选定状态

C# 更改绑定列表框中项目的选定状态,c#,windows-phone-7,binding,listbox,listboxitem,C#,Windows Phone 7,Binding,Listbox,Listboxitem,我试图根据项目绑定到的类中是否使用了对象来更改绑定列表框中项目的选定状态,但我似乎找不到执行此操作的方法,并且它必须保持动态,因为对象可能会更改,从而在类的不同实例中使用: <Popup x:Name="ContextMenuPopup" Height="250" Width="300" Margin="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> <Canvas Name

我试图根据项目绑定到的类中是否使用了对象来更改绑定列表框中项目的选定状态,但我似乎找不到执行此操作的方法,并且它必须保持动态,因为对象可能会更改,从而在类的不同实例中使用:

  <Popup x:Name="ContextMenuPopup" Height="250" Width="300" Margin="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <Canvas Name="popupholder" Background="DarkSeaGreen" Height="250" Width="300" HorizontalAlignment="Center">
                <StackPanel Orientation="Vertical">
                <TextBlock Name="popupTitle" Text="Select Investments" Margin="20,0,0,0" FontFamily="Courier New" FontSize="22" HorizontalAlignment="Center" Foreground="Black" />
                <ListBox x:Name="investPicker" SelectionChanged="ListBox_SelectionChanged" LayoutUpdated="investPicker_LayoutUpdated" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="10,20,0,0" SelectionMode="Multiple">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Name}" Width="100"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox> 
                    <Button Name="executeSelection" Content="Ok" Click="executeSelection_Click" Margin="40,5,0,0" VerticalAlignment="Bottom"/>
                </StackPanel>           
            </Canvas>
        </Popup>

现在很明显,代码不起作用,因为它是从我的类到ListBoxItem的无效转换,有人知道我如何做到这一点吗?

看起来您只有一个选定的项,那么这样如何:

investPicker.SelectedItem = storedInvestments
    .FirstOrDefault(i => i.attachedCards.Any(c => c.Id == activeCard.ID));
或者如果您有多个:

var matchingItems = storedInvestments
    .Where(i => i.attachedCards.Any(c => c.Id == activeCard.ID));

foreach (var i in matchingItems)
    investPicker.SelectedItems.Add(i);
[编辑]

OP不知道箭头操作符
=>
的意思,所以让我们澄清一下。它被称为lambda表达式,在本次讨论中,您可以将其视为一个小型的内联方法

这句话:

i.attachedCards.Any(c => c.Id == activeCard.ID);
可以理解为“i.attachedCards是否包含任何c.Id等于activeCard.Id的卡c”

表示
c=>c.Id==activeCard.Id
的位表示一种方法,该方法也可以写成:

static bool IsActiveCard(Card c) { return c.Id == activeCard.ID; }
事实上,如果你这样写的话,你可以把表达式改成:

i.attachedCards.Any(IsActiveCard);
表达式的其余部分是对
IEnumerable
扩展方法
Any
的调用,该方法为
attachedCards
序列中的每个元素计算方法,直到找到方法返回true的元素或序列结束。然后,如果找到元素,则返回true;如果没有找到元素,则返回false

那么这一点:

storedInvestments
    .FirstOrDefault(i => i.attachedCards.Any(c => c.Id == activeCard.ID));
可以理解为“给我在storedInvestments中的第一个匹配投资,i.attachedCards包含一张卡c…”等等

它在
storedInvestments
序列中查找第一个元素,其中内部表达式返回true。如果没有找到任何内容,则返回类型的默认值(可能是
null
,除非
storedInvestments
struct


我不会继续谈论技术细节,但如果你真的对所有这些工作方式感兴趣,Jon Skeet已经写了一篇关于如何实际实现的文章。强烈推荐。:)

工作起来就像做梦一样,非常感谢,我对这一点还是新手,所以我不知道我=>实际上做了什么,但它是有效的:)我在上面添加了一些解释性的东西,希望能有所帮助!
storedInvestments
    .FirstOrDefault(i => i.attachedCards.Any(c => c.Id == activeCard.ID));