2009-07-24 10 views
10

I tienen una TabControl cuyos elementos están unidos a una ObservableCollection:¿Cómo asegurarme de que mi WPF TabControl siempre tiene una pestaña seleccionada cuando contiene al menos una pestaña?

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

se añaden y se retiran Las pestañas como se esperaba medida que se añaden elementos y se eliminan de la colección. Sin embargo, el SelectedItem revierte a -1 (lo que significa que no hay una pestaña seleccionada) cuando la colección está vacía. Luego, cuando se agrega un artículo, el SelectedItem permanece en -1 y la nueva pestaña no está seleccionada.

¿Cómo hago para que TabControl seleccione la nueva pestaña cada vez que se agrega un artículo a la colección vacía?

Respuesta

12

Puede haber una manera más fácil, pero podría enganchar el evento de colección cambiada en el ObservableCollection en su máquina virtual y establecer la propiedad SelectedItem en el nuevo elemento (suponiendo que tiene el elemento seleccionado vinculado a una propiedad en la máquina virtual).

+0

+1 Hacer esto con VM y enlace es * el * camino a seguir. –

+0

Usaría SelectedItem en lugar de índice, pero es algo más personal. –

+0

Funciona bien con SelectedItem pero no con SelectedIndex. Aún así, misión cumplida! – GraemeF

0

es mejor que sobrescriba la funcionalidad "OnTabAdded" para comprobar si se agrega una nueva (primera) y luego establecer SelectedItemIndex en 0;

Dado que está utilizando ObservableCollection, usted sabe cuándo cambia su colección, así que me suscribiría al evento modificado de la colección y verificaría el número de elementos en él.

+0

ya he intentado fijar la SelectedIndex a 0 en el controlador de eventos CollectionChanged y no tuvo ningún efecto - tal vez mi manejador se le llamaba antes del evento llegó a la TabControl. – GraemeF

2

Si está buscando una implementación pura de MVVM, agregue una propiedad Index al ViewModel y en CollectionChanged puede establecer Index = 0 si no hay elementos dentro. Y en el XAML que se puede enlazar Índice de la siguiente manera

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

Eso es exactamente lo que inicialmente hice, pero creo que estaba manejando el evento antes de que TabControl lo obtuviera, así que no tuvo ningún efecto. Le daré otra oportunidad - ¡tal vez tengo algo mal! – GraemeF

+0

Asegúrate de que el organizador de propiedades Index levante el evento propertyChanged –

+0

Esta es de lejos la mejor solución :) Ojalá pudiera llegar a la cima ... – Johan

3

Lo que puede hacer es suscribirse para el evento TabControl.ItemContainerGenerator.StatusChanged y si el estado es ContainersGenerated y la SelectedIndex TabControl es -1, a continuación, hacer el SelectedIndex de 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; 
    } 
} 

Hay soluciones de terceros que tienen esta funcionalidad lista para usar. RadTabControl de Telerik selecciona el primer elemento cada vez que la colección cambia su estado de vacío a "que contiene un solo elemento".

probar la demo aquí: http://demos.telerik.com/silverlight/#TabControl/AddingAndRemovingTabs

Nota: Es una demostración SL, pero funciona de la misma en WPF.

0

Tuve el mismo problema y logré solucionarlo vinculando el elemento seleccionado al primer elemento de la lista dinámica.

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

a mí me funcionó :)

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