I do not understand why you are not just opening such a property in your ViewModel:
ObservableCollection<object> Items { get { var list = new ObservableCollection<object>(People); list.Add(Product); return list; } }
and then in your xaml you do the following:
<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>
UPDATE:
If you need to manipulate your model differently, follow these steps:
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); } }
This is just an example. But if you modify the above to suit your needs, this may lead to your goal.
source share