2008-11-08 19 views
3

在我的小型WPF項目中,我有一個帶有三個選項卡的TabControl。每個選項卡上都有一個ListBox。這個項目跟蹤我們需要購買的雜貨。 (不,這不是家庭作業,這是我的妻子。)所以我有一個ShoppingListItem s的清單,其中每個都有一個Name和一個Needed財產:true當我們需要的物品,和false我們購買後。將一個集合綁定到帶有過濾器的多個選項卡

所以三個選項卡是全部,購買和需要。他們應該都指向相同的ShoppingListItemCollection(從ObservableCollection<ShoppingListItem>繼承)。但買方應該只顯示需要的項目是錯誤的,而需求應該只顯示需要的項目是真實的。 (所有選項卡上的項目都有複選框。)

這看起來好像不是很難,但幾個小時後,我就不再接近於搞清楚了。看起來像一個CollectionView或CollectionViewSource是我需要的,但我無法得到任何事情發生;我檢查並取消選中「全部」選項卡上的框,其他兩個選項卡上的項目只是坐在那裏盯着我。

任何想法?

+0

我發現在WPF中,有5000種方法可以進行數據綁定。不幸的是,其中只有大約3個是正確的。其他4997給出了無法理解的錯誤。 – 2008-11-08 16:06:16

回答

0

這裏有一對夫婦的想法:

  1. 彈片買來所需負荷,用你想要的物品,或
  2. 當標籤買來所需負載創建新集合自己進行篩選,覆蓋根據需要列出項目數據綁定和切換可見性
3

您可以使用CollectionViewSource通過過濾器重新使用原始集合。

<Window.Resources> 
    <CollectionViewSource x:Key="NeededItems" Source="{Binding Items}" Filter="NeededCollectionViewSource_Filter" /> 
    <CollectionViewSource x:Key="BoughtItems" Source="{Binding Items}" Filter="BoughtCollectionViewSource_Filter" /> 
</Window.Resources> 

<TabControl> 
    <TabItem Header="All"> 
     <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Items}" /> 
    </TabItem> 
    <TabItem Header="Bought"> 
     <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Source={StaticResource BoughtItems}}" /> 
    </TabItem> 
    <TabItem Header="Needed"> 
     <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Source={StaticResource NeededItems}}" /> 
    </TabItem> 
</TabControl> 

過濾器需要一些後面的代碼。

private void NeededCollectionViewSource_Filter(object sender, FilterEventArgs e) 
{ 
    e.Accepted = ((ShoppingListItem) e.Item).Needed; 
} 

private void BoughtCollectionViewSource_Filter(object sender, FilterEventArgs e) 
{ 
    e.Accepted = !((ShoppingListItem) e.Item).Needed; 
} 
相關問題