WPF Merge ItemsSource Lists - PullRequest
       37

WPF Merge ItemsSource Lists

4 голосов
/ 14 июля 2010

Я работаю с 2 списками в бэкэнд-классе.Каждый список другого типа.Хотел бы предоставить пользователю один список (содержащий объединение обоих списков), из которого при выборе элемента в этом списке отображаются подробности элемента.

Код будет выглядеть примерно так:1004 * Мой внутренний класс выглядит примерно так

public ObservableCollection<Person> People {get;}
public ObservableCollection<Product> Products {get;}

Мой XAML выглядит примерно так

<ListBox x:Name="TheListBox" ItemsSource={Some Expression to merge People and Products}>
   <ListBox.Resources>
         People and Product Data Templates
   </ListBox.Resources>
</ListBox>
      ...
<ContentControl Content={Binding ElementName=TheListBox, Path=SelectedItem }>
   <ContentControl.Resources>
         Data Templates for showing People and Product details
   </ContentControl.Resources>
</ContentControl>

Есть предложения?

Ответы [ 3 ]

8 голосов
/ 14 февраля 2011

Для этого вы можете использовать CompositeCollection .Посмотрите на этот вопрос .

2 голосов
/ 15 июля 2010

Я не понимаю, почему вы просто не выставляете свойство, подобное этому, в вашей ViewModel:

ObservableCollection<object> Items 
{
  get 
  {
    var list = new ObservableCollection<object>(People);
    list.Add(Product);
    return list;
  }
}

, а затем в вашем xaml вы делаете это:

<ListBox x:Name="TheListBox" ItemsSource={Binding Items}>
   <ListBox.Resources>
         People and Product Data Templates
   </ListBox.Resources>
</ListBox>
      ...
<ContentControl Content={Binding ElementName=TheListBox, Path=SelectedItem }>
   <ContentControl.Resources>
         Data Templates for showing People and Product details
   </ContentControl.Resources>
</ContentControl>

ОБНОВЛЕНИЕ:

Если вам нужно по-другому манипулировать моделью, сделайте следующее:

ObservableCollection<object> _Items 
ObservableCollection<object> Items 
{
  get 
  {
    if (_Items == null)
    {
      _Items = new ObservableCollection<object>();
      _Items.CollectionChanged += EventHandler(Changed);
    }
    return _Items;
  }
  set 
  { 
    _Items = value;
    _Items.CollectionChanged += new CollectionChangedEventHandler(Changed);
  }
}

void Changed(object sender,CollectionChangedEventArgs e)
{
  foreach(var item in e.NewValues)
  {
    if (item is Person)
      Persons.Add((Person)item);
    else if (item is Product)
      Products.Add((Product)item);
  }
}

Это всего лишь пример.Но если вы измените вышеперечисленное в соответствии со своими потребностями, это может привести к вашей цели

0 голосов
/ 15 июля 2010

Я нашел сообщение в блоге здесь , которое дало мне большую часть пути.Я использовал авторов AggregateCollection вместе с многозначным преобразователем для выполнения работы.

...