WPF Merge ItemsSource Lists
I am working with a 2 lists in a backend class. Each list is a different type. Would like to present the user with a single list (containing a union of both lists) of which when an item in this list is selected the item's details appear.
The code will look something like:
My backend class looks somethings like this
public ObservableCollection<Person> People {get;}
public ObservableCollection<Product> Products {get;}
My XAML Looks Something Like This
<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>
Any suggestions?
You can use a CompositeCollection for this. Have a look at this question.
I don't understand why you don't just have expose a property like this 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 this:
<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 do the following:
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 meet your needs, it might get you to your goal
I found a blog post here that got me most of the way. I used the authors AggregateCollection along with a multivalueconverter to get the job done.
精彩评论