GraemeF
GraemeF

Reputation: 11457

How to make sure my WPF TabControl always has a selected tab when it contains at least one tab?

I have a TabControl whose items are bound to an ObservableCollection:

<TabControl ItemsSource="{Binding MyObservableCollection}" />

The tabs are added and removed as expected as items are added and removed from the collection. However, the SelectedItem reverts to -1 (meaning there is no selected tab) whenever the collection is empty. Then, when an item is added, the SelectedItem stays at -1 and the new tab is not selected.

How do I make the TabControl select the new tab whenever an item is added to the empty collection?

Upvotes: 11

Views: 6501

Answers (6)

Mihail Shishkov
Mihail Shishkov

Reputation: 15797

<TabControl ItemsSource="{Binding MyObservableCollection}" SelectedItem="{Binding MyObservableCollection[0]}" />

Upvotes: 0

Anya Hope
Anya Hope

Reputation: 1361

I had the same problem and managed to fix it by binding the selected item to the first item in the dynamic list.

<TabControl ItemsSource="{Binding MyObservableCollection}" SelectedItem="{Binding MyObservableCollection.First}" />

Worked for me :)

Upvotes: 0

Kiril Stanoev
Kiril Stanoev

Reputation: 1865

What you can do is to subscribe for TabControl.ItemContainerGenerator.StatusChanged event and if the status is ContainersGenerated and the SelectedIndex of TabControl is -1, then to make the SelectedIndex of TabControl 0;

// peopleCollection is an ObservableCollection<Person>
People peopleCollection = new People();
public Window1()
{
    InitializeComponent();
    // MyTabControl is an instance of TabControl
    MyTabControl.ItemsSource = peopleCollection;
    MyTabControl.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    if((sender as ItemContainerGenerator).Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated && MyTabControl.SelectedIndex == -1)
    {
        MyTabControl.SelectedIndex = 0; 
    }
}

There are 3-rd party solutions that has this functionality out of the box. Telerik's RadTabControl selects the first item whenever the collection changes its state from empty to "containing single item".

Try the demo here: http://demos.telerik.com/silverlight/#TabControl/AddingAndRemovingTabs

Note: It is a SL demo, but it works the same in WPF.

Upvotes: 4

Jobi Joy
Jobi Joy

Reputation: 50038

If you are looking for a pure MVVM implementation then, add a Index property to the ViewModel and on the CollectionChanged you can set Index=0 if there is no items inside. And in the XAML you can bind that Index as below

<TabControl ItemsSource="{Binding MyObservableCollection}" SelectedIndex="{Binding Index}" />

Upvotes: 2

Steven Robbins
Steven Robbins

Reputation: 26599

There might be an easier way, but you could hook the collection changed event on the ObservableCollection in your VM and set the SelectedItem property to the new item (assuming you have the selected item bound to a property on the VM).

Upvotes: 12

RoelF
RoelF

Reputation: 7573

you're best bet is to probably overwrite the "OnTabAdded" functionality to check if a new one (first one) is added and then setting the SelectedItemIndex to 0;

since you are using ObservableCollection, you know when your collection changes, so I'd subscribe to the changed event form the collection and check the number of items in it.

Upvotes: 0

Related Questions