2012-07-11 145 views
0

我試圖改變綁定列表框中的項目的選定狀態,基於如果在項目綁定到的類中使用對象,我似乎無法發現做這件事的方式,它具有保持活力,因爲對象可能會改變,因此在類的不同實例中使用:更改綁定列表框中的項目的選定狀態

<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> 

Thwe後面的代碼是:

 private void ApplicationBarIconButton_Click_1(object sender, EventArgs e) 
    { 
     this.investPicker.ItemsSource = storedInvestments; 

     foreach (Investment investment in investPicker.Items) 
     { 
      foreach (CardDataSet card in investment.attachedCards) 
       if (card.ID == activeCard.ID) 
        VisualStateManager.GoToState((ListBoxItem) investPicker.Items[investment.ID -1], "Selected", true); 
     } 

     ContextMenuPopup.IsOpen = true; 

    } 

現在很明顯的代碼不起作用從我的類到ListBoxItem的無效投射,任何人都知道我可以如何這個?

回答

1

看起來你只有一個選擇的項目,所以這個怎麼樣:

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,對於它c.Id等於activeCard.ID」。

,說c => c.Id == activeCard.ID位表示也可以寫成一個方法:

static bool IsActiveCard(Card c) { return c.Id == activeCard.ID; } 

而事實上,如果你把它寫的話,你可以在表達式更改爲:

i.attachedCards.Any(IsActiveCard); 

表達式的其餘部分是對IEnumerable<T>擴展方法Any的調用,該方法計算attachedCards序列中每個元素的方法,直到它找到方法返回true的元素或seque結束。如果它發現了一個元素,則它返回true,否則返回false。

然後,這一點:

storedInvestments 
    .FirstOrDefault(i => i.attachedCards.Any(c => c.Id == activeCard.ID)); 

可以讀作「給我的第一個匹配的投資我在storedInvestments爲其i.attachedCards包含卡C ......」等等。

它看起來在storedInvestments序列,其中所述內表達式返回true的第一個元素。如果沒有發現任何東西,它返回類型的默認值(這很可能是null,除非storedInvestmentsstruct)。

我不會去上有關的技術細節,但如果你在這一切是如何工作很感興趣,喬恩斯基特有它如何實際實施寫一個偉大的series of articles。強烈推薦。:)

+0

作品像做夢一樣,非常感謝你,我仍然在這個新的,所以我不知道我=>實際上做了,但我加了一些解釋性的東西上,它的工作原理:) – Phil 2012-07-11 13:24:00

+0

,希望它有助於! – Rytmis 2012-07-12 10:09:07

相關問題