2013-08-28 34 views
3

我遇到了奇怪的現象。如果我做了很多網絡搜索,我無法獲得解決方案。 我使用WPF,VS2010引擎。 GUI主要由四個ListBox組成。WPF:ListBox SelectedItems沒有更新或選擇變化時正在積累

第一個列表框是Mart分支的集合,第二個列表框是商品的集合,例如水果,肉類,蔬菜等等,這是Mart賣的。 第三個ListBox是一種Mart商品。 (蘋果,桃子,同行,瓜...)第4列表框是一種選定的水果的聚合,例如,如果蘋果被選中,cortland,crabapple,sansa,gala等。

在啓動程序時,所有超市分店都顯示在第1個列表框中,如果我選擇一個分店,則在超市中出售的商品列表顯示在第2和第n列表框中。

以同樣的方式,在第3個列表框和第4個列表框中顯示所選項目的子類別。

1'st,2'nd,4'th ListBox do good,但3'rd ListBox有錯誤。我認爲2'nd和3'rd具有相同的結構。

3'rd ListBox無法更新selecteditem更改。無論SelectionMode(Single,Multiple,Extend)如何,3'rd ListBox的SelectedItem都包含我選擇的所有項目 。此外,3'rd ListBox.SelectedItems包含重複的項目。

但是,SelectionChanged事件觸發是好的。只有SelectedItems或SelectedItem是問題。

目前,爲了使這個功能,我使用繞道的方式。在發生SelectionChanged事件後,我捕獲了SelelctionChangedEventArgs的AddedItems。 所以,我用AddedItems,而不是像SelectdItem =的SelectionMode「單」

我試了很多建議,VirtualizingStackPanel.IsVirtualizing =「假」,IsSynchronizedWithCurrentItem =「真」,但我不能找到解決辦法。 對不起,我無法提供所有後臺代碼和〜xaml。其實這個應用程序非常大。所以,我不能那樣做。

而且,我很抱歉我的英語水平很差。

分行

  <StackPanel Orientation="Vertical" Grid.Column="0"> 
       <Label HorizontalAlignment="Center">Goods</Label> 
       <ListBox Name="lbLoadedGoods" Height="120" Margin="2" SelectionMode="Single" SelectionChanged="lbLoadedGoods_SelectionChanged"></ListBox> 
      </StackPanel> 
      <StackPanel Orientation="Vertical" Grid.Column="1" > 
       <Label HorizontalAlignment="Center">ITEM</Label> 
       <!-- ListBox Double Click Event Setter --> 
       <ListBox Name="lbLoadedItems" Height="120" Margin="2" SelectionMode="Single" SelectionChanged="lbLoadedItems_SelectionChanged"> 
        <ListBox.ItemContainerStyle> 
         <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem }}"> 
          <EventSetter Event="MouseDoubleClick" Handler="lbLoadedItems_MouseDoubleClick"></EventSetter> 
         </Style> 
        </ListBox.ItemContainerStyle> 
       </ListBox> 
      </StackPanel> 
     </Grid> 
    </GroupBox> 

    <Label Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center">SubItem</Label> 
    <ListBox Name="lbSelectedSubItemData" Height="80" Grid.Column="0" Grid.Row="1" Margin="4"> 
     <!-- ListBox Double Click Event Setter --> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
       <EventSetter Event="MouseDoubleClick" Handler="lbSelectedSubItemData_MouseDoubleClick"></EventSetter> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 


</StackPanel> 





    // public ObservableCollection<string> BranchList { get; private set; } 
    // public ObservableCollection<Goods> GoodList { get; private set; } 
    // public ObservableCollection<Items> ItemList { get; private set; } 
    // private ObservableCollection<string> m_usbitemlist = new ObservableCollection<string>(); 
    // public ObservableCollection<string> SubItemList { get { return m_usbitemlist; } private set { m_usbitemlist = value; } } 


    private void BindFabFileList() 
    { 
     lbBranches.ItemsSource = BranchList; 
     lbLoadedGoods.ItemsSource = GoodList; 
     lbLoadedItems.ItemsSource = ItemList; 
    } 

    private void lbLoadedGoods_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

     ItemList = new ObservableCollection<Items>(); 

     // ItemList Add. From Selected Goods 
    } 
+1

我覺得你的問題是你的數據不會得到更新..和也你設置你的列表框的一些列表的ItemsSource ..所以你的解決方案可能是..當你改變選定的項目或選定的項目時再次設置itemsSource ..並使您的列表observablecollections..it幫助你我認爲...對於任何查詢更新下面.. – loop

+0

如果我正確理解你,這是主要細節Sceranio閱讀關於IsSynchronizedWithCurrentItem =「True」 – makc

+0

我的ListBox ItemsSource是ObservableCollection如你所見。 「ItemList」是ObservableCollection。所有的操作都很好。只是「lbLoadedItems.SelectedItems」沒有更新。我選擇的所有項目都是在「lbLoadedItems」中累積的,我會更多地考慮您的建議。感謝您的關注。 – chaji99

回答

0

你的參考對象ITEMLIST設置爲一個新的實例,而不是更新的列表WPF已經在項目迷上了。 WPF自動掛鉤到ObservableCollection的CollectionChanged事件,但它不知道你已經改變了後面代碼中的引用。用戶界面仍然連接到內存中的舊對象。

相反的:

ItemList = new ObservableCollection<Items>(); 
ItemList.Add(...); 

這樣做:

ItemList.Clear(); 
ItemList.Add(...);