Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
Ask Question
this is concerning WPF and MVVM,
I have a list of items that are unsorted (e.g., "item3, item2, item5, item1, item4"). For each item, I want to display a number of comboboxes equal to the number of items (for
n
items there needs to be
n
comboboxes). The user then selects an item for each combo box, essentially sorting the list (resulting in a list of "item1, item2, Item3, item4, item5."). The sorted values are then stored in another list of items. Sorting has to be done by the user.
I have a ViewModel that contains both lists, one with the unsortedItems, the sortedList initially a copy to be the same size.
I manually created a combo box for each item, all with the same Itemssource bound to the unsorted list of items. I then bound each combo box SelectedItem with an index representing which combobox it was i.e., for the first combo box SelectedItem="{binding SortedList[0]}".
The problem with this approach is that I don't know how many items there will be. I thought an Itemscontrol would do the job here but I can't seem to figure out how to embed a combobox inside an itemscontrol so that I can use DisplayMemberPath and SelectedItem properly and not share the selected value. This is what I tried:
public class Item
public Item(int id, string name)
Id = id;
Name = name;
public int Id { get; set; }
public string Name { get; set; }
Item Selection Part
public class ItemSelectionPart
public ItemSelectionPart(List<Item> allItems)
this.allItems = allItems;
public List<Item> allItems { get; set; }
public Item Selection { get; set; }
ViewModel
public class ComboViewModel
public string test2 { get; set; }
public List<Item> items { get; set; }
public ObservableCollection<ItemSelectionPart> ItemsSelection { get; set; }
public ComboViewModel()
test2 = "test";
items = new List<Item>
new Item(100, "Entry #1"),
new Item(101, "Entry #2"),
new Item(102, "Entry #3"),
new Item(103, "Entry #4")
ItemsSelection = new ObservableCollection<ItemSelectionPart> (Enumerable.Repeat(new ItemSelectionPart(items), items.Count));
Main Window Xaml
<Window x:Class="TestingComboBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestingComboBox"
d:DataContext="{d:DesignInstance Type=local:ComboViewModel}"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<ItemsControl
x:Name="level1"
ItemsSource="{Binding ItemsSelection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<ComboBox
x:Name="Combo"
ItemsSource="{Binding Path=allItems}"
DisplayMemberPath="{Binding Path=allItems.Id}"
SelectedValue="{Binding Path=Selection}">
</ComboBox>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Window>
I know that displaymemberpath doesn't work - but left there for what I intended
Main Window.cs
public partial class MainWindow : Window
private ComboViewModel D;
public MainWindow()
InitializeComponent();
D = new ComboViewModel();
this.DataContext = D;
Issue with share is, that with Enumerable.Repeat(new ItemSelectionPart(items), items.Count)
you create an enumeration with same instance new ItemSelectionPart(items)
. Later you use the same instance by each combobox, modifying it you impact all comboboxes.
DisplayMemberPath
gets just string, not binding.
See the fix:
<ItemsControl ItemsSource="{Binding ItemsSelection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<ComboBox
x:Name="Combo"
ItemsSource="{Binding Path=allItems}"
DisplayMemberPath="Name"
SelectedValue="{Binding Selection}">
</ComboBox>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
public ComboViewModel()
test2 = "test";
items = new List<Item>
new Item(100, "Entry #1"),
new Item(101, "Entry #2"),
new Item(102, "Entry #3"),
new Item(103, "Entry #4")
var selPartList = new List<ItemSelectionPart>(items.Count);
for (int i = 0; i < items.Count; i++)
selPartList.Add(new ItemSelectionPart(items));
ItemsSelection = new ObservableCollection<ItemSelectionPart>(selPartList);
//ItemsSelection = new ObservableCollection<ItemSelectionPart>(Enumerable.Repeat(new ItemSelectionPart(items), items.Count));
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.