Привязка одной коллекции к нескольким вкладкам с помощью фильтров - PullRequest
3 голосов
/ 08 ноября 2008

В моем небольшом проекте WPF у меня есть TabControl с тремя вкладками. На каждой вкладке есть ListBox. Этот проект отслеживает продукты, которые мы должны купить. (Нет, это не домашняя работа, это для моей жены.) Итак, у меня есть список ShoppingListItem s, каждый из которых имеет свойство Name и Needed: true, когда нам нужен элемент, и false после того, как мы его купим.

Итак, три вкладки: Все, Куплено и Нужно. Все они должны указывать на один и тот же ShoppingListItemCollection (который наследуется от ObservableCollection<ShoppingListItem>). Но Bought должно показывать только те предметы, где «Needed» - «ложь», а «Needed» - только те, где «Needed» - «истина». (На вкладке «Все» есть флажки для элементов.)

Это не кажется сложным , но через пару часов я уже не приблизился к тому, чтобы понять это. Кажется, что мне нужен CollectionView или CollectionViewSource, но я ничего не могу сделать; Я отмечаю и снимаю флажки на вкладке «Все», а элементы на двух других вкладках просто сидят и смотрят на меня.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 08 ноября 2008

Вы можете использовать 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;
}
0 голосов
/ 08 ноября 2008

Вот пара идей:

  1. Когда загружаются и покупаются вкладки, отфильтруйте их самостоятельно, создав новые коллекции с нужными вам элементами, или
  2. при загрузке вкладок "Куплено" и "Требуется" переопределить привязку базы данных элемента списка и переключить видимость на основе значения "Требуется"
...