Joe.Net
Joe.Net

Reputation: 1215

XAML Control array for static number of combo boxes

I would like an array of 10 combo boxes on a wpf form.

The ItemsSource of the combo boxes are identical - an ObservableCollection of selectable Items.

Each Selected Item will bound to an item in a different ObservableCollection, imaginatively called 'SelectedItems'..

What is the best way to do the array? I could of course have 10 separate combo boxes but this would be not very elegant..

I don't think an ItemsControl template is what I'm after as the number of combo boxes is static.

Thanks

Joe

Upvotes: 2

Views: 1034

Answers (4)

Rachel
Rachel

Reputation: 132548

If I understand you right, you have 10 ComboBoxes with the same item list, but different data sources

In that case, I could create a common style for the ComboBox which sets the common properties such as ItemsSource (and SelectedItem if the binding is the same for all items), and then actually create the individual ComboBoxes on the form as needed.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type ComboBox}">
            <!-- Set the binding to wherever your ItemsSource resides. In this
                 case,I'm binding to a static class called Lists and a static 
                 property called ComboBoxItems -->
            <Setter Property="ItemsSource" 
                    Value="{Binding Source={x:Static local:Lists.ComboBoxItems}}" />

            <!-- Only use this setter if your binding is the same everywhere -->
            <Setter Property="SelectedItem" Value="{Binding SelectedItem}" />
        </Style>
    </StackPanel.Resources>

    <ComboBox DataContext="{Binding Item1}" />
    <ComboBox DataContext="{Binding Item2}" />
    <ComboBox DataContext="{Binding Item3}" />
    <ComboBox DataContext="{Binding Item4}" />
    <ComboBox DataContext="{Binding Item5}" />
    <ComboBox DataContext="{Binding Item6}" />
    <ComboBox DataContext="{Binding Item7}" />
    <ComboBox DataContext="{Binding Item8}" />
    <ComboBox DataContext="{Binding Item9}" />
    <ComboBox DataContext="{Binding Item10}" />
</StackPanel>

Of course, if the DataSource for your ComboBoxes CAN be put in a collection, it is preferred that they are and that you use an ItemsControl to display the ComboBoxes

<ItemsControl ItemsSource="{Binding SelectedItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ComboBox SelectedItem="{Binding }"
                      ItemsSource="{Binding Source={x:Static local:Lists.ComboBoxItems}}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Upvotes: 3

ColinE
ColinE

Reputation: 70122

Personally I think an ItemsControl which has an ItemTemplate which constructs each ComboBox is the way to go! Are you always going to have exactly 10 of these?

From an MVVM perspective, I can imagine a parent View Model which has a collection of selection view models. Each selection view model will have the list of items that can be selected, and the currently selected item. This view model will easily bind to your view.

Upvotes: 2

djdanlib
djdanlib

Reputation: 22476

Not knowing why you need this... which would probably be important in deciding how to do this... here is my stab at it.

Why not design the UI, give each ComboBox a name, create a List and Add each into that List at runtime?

Upvotes: -1

Reed Copsey
Reed Copsey

Reputation: 564333

Each Selected Item will bound to an item in a different ObservableCollection, imaginatively called 'SelectedItems'..

Given that you're effectively binding to a collection, I would do an ItemsControl template, and just treat it that way. Unless you want to customize the layout (ie: these won't be arranged together in the View), that will simplify the design, even if the number of items is always "static".

If you want to have the items arranged separately on the View, then just having 10 combo boxes may be more appropriate.

Upvotes: 2

Related Questions