views:

40

answers:

2

I have a DockPanel set up in the DataTemplate of an ItemsControl as below:

<ItemsControl HorizontalContentAlignment="Stretch">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <DockPanel>
        <ComboBox DockPanel.Dock="Left"/>
        <ComboBox DockPanel.Dock="Left"/>
        <Button DockPanel.Dock="Right">Button</Button>
        <!-- This will appear before the button...it has to go after it in the XAML so it will fill properly in the DockPanel -->
        <TextBox DockPanel.Dock="Left" MinWidth="100" HorizontalAlignment="Stretch"/>
      </DockPanel>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

I want the textbox to fill all the remaining space between the comboboxes and the button. I had to put the textbox last in the XAML because DockPanel will only fill the last child. It looks great; however, the tab order is now screwed up. It now tabs combobox-combobox-button-textbox instead of combobox-combobox-textbox-button.

I tried using KeyboardNavigation.TabIndex properties on each item, but since this is a DataTemplate for an ItemsControl (each of these dockpanels will be for a separate item), that made the tab order jump vertically down each of the items' comboboxes, then vertically down each textbox, then vertically down each button, rather than the desired behavior of going across each row, then down.

Example UI:

[Combo11] [Combo12] [Text1] [Button1]
[Combo21] [Combo22] [Text2] [Button2]

In the current state of affairs, it goes Combo11,Combo12,Button1,Text1,Combo21,Combo22,Button2,Text2. If I add TabOrder properties, it goes Combo11,Combo21,Combo12,Combo22,Text1,Text2,Button1,Button2.

I'd like it to go Combo11,Combo12,Text1,Button1,Combo21,Combo22,Text2,Button2.

Does anyone have any ideas on how to solve this UI problem?

A: 

Have you tried explicitly setting the tab order?

<Control KeyboardNavigation.TabIndex="0" />
Robaticus
"I tried using KeyboardNavigation.TabIndex properties on each item, but since this is a DataTemplate for an ItemsControl (each of these dockpanels will be for a separate item), that made the tab order jump vertically down each of the items' comboboxes, then vertically down each textbox, then vertically down each button, rather than the desired behavior of going across each row, then down."
NickAldwin
Wow, seriously a down vote for this?
Robaticus
No harm meant, but I tend to downvote answers that don't really help explain anything...in this example, I had already mentioned trying the tab order in my question. Again, I know since you can't hear me talking, you could misconstrue this as a snarky comment, but I'm really just trying to keep StackOverflow a helpful and uncluttered place.
NickAldwin
+1  A: 

You could use a Grid instead of the DockPanel, like so:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <ComboBox />
    <ComboBox Grid.Column="1"/>
    <TextBox Grid.Column="2" MinWidth="100" />
    <Button Grid.Column="3">Button</Button>
 </Grid>

And if you want them to align nicely in the different columns - you could use SharedSizeGroup.

Goblin
That worked really well...and I have to ask, why does the first combobox have no column number? Does that mean it's automatically assigned to column #0? And thanks a bunch for the SharedSizeGroup tip--I would have had no idea what to even search! (p.s. you forgot / in </Grid.ColumnDefinitions>)
NickAldwin
It could have a Grid.Column="0" - but 0 is the default value - and I'm lazy :-). Yeah, SharedSizeGroup is sort of a hidden gem. I updated my example for others.
Goblin
Bah, couldn't get the SharedSizeGroup to work properly--probably because of the star sizing in the third column. :(
NickAldwin
Ah, it seems I needed a header for that, as per directions here http://blogs.interknowlogy.com/johnbowen/archive/2007/08/27/21132.aspx -EDIT- or perhaps not...but that site still helped. It seems to be working now, thanks a bunch!
NickAldwin
Last update, I promise! It turned out it all hinged on the Grid.IsSharedSizeScope property, which I didn't realize had to be on the *parent* -- in this case, the ItemsControl.
NickAldwin
I'm happy you got it working :-). Should probably have mentioned the IsSharedSizeScope...
Goblin