2017-10-12 4 views
1

J'ai une fenêtre principale avec un TabControl dedans. Chaque onglet contient un UserControl associé. Dans l'un de mes UserControl, j'ai un bouton. Lorsque je clique sur le bouton, je voudrais changer le SelectedIndex du TabControl qui est dans ma fenêtre principale. J'utilise le modèle MVVM donc si possible, je voudrais le faire en XAML avec la propriété Command sur mon bouton.Modifier SelectedIndex de TabControl dans MainWindow de Child UserControl

Par exemple:

<Button Content="Switch Tab" Command="SwitchTabCommand" /> 

Merci à l'avance mes collègues programmeurs!

EDIT:

Le modèle de vue de la fenêtre:

public class CoolViewModel : BaseViewModel 
{ 
    #region Properties 

    public ObservableCollection<ITabViewModel> Tabs { get; set; } 
    public ITabViewModel SelectedTab { get; set; } 

    #endregion 

    #region Constructor 

    public CoolViewModel() 
    { 
     Tabs = new ObservableCollection<ITabViewModel> 
     { 
      new VeryNiceViewModel(), 
      new VeryNiceViewModel() 
     }; 
    } 

    #endregion 
} 

Voici le code d'un UserControl dans un onglet:

public class VeryCoolViewModel : BaseViewModel, ITabViewModel 
{ 
    #region Properties 

    public ObservableCollection<Test> Tests { get; set; } 
    public Test currentSelection { get; set; } 
    public string TabHeader { get; set; } 

    #endregion 

    #region Commands 

    ICommand GoToOtherTab { get; set; } 

    #endregion 

    #region Constructor 

    public GabaritSelecteurViewModel() 
    { 
     Tests = new ObservableCollection<Test> 
     { 
      new Test { Title = "Title #1" }, 
      new Test { Title = "Title #2" }, 
      new Test { Title = "Title #3" }, 
      new Test { Title = "Title #4" }, 
      new Test { Title = "Title #5" } 
     }; 

     TabHeader = "Tests"; 

     GoToOtherTab = new RelayCommand(GoToTab, parameter => true); 
    } 

    #endregion 

    #region Methods 

    private void GoToTab(object parameter) 
    { 
     // I don't know how to tell to the 
     // parent window to go to the other tab... 
    } 

    #endregion 
} 

Et voici le XAML pour le UserControl (à l'intérieur du TabControl):

<Button Content="Go to the other tab" Command="{Binding GoToOtherTab}" /> 
+0

SelectedIndex est un PITA. Il est toujours plus facile d'utiliser SelectedItem (à condition que votre instance en soit une dans la collection ItemsSource) – Will

Répondre

0

donner à l'enfant viewmodel une propriété publique

ICommand SwitchTabCommand { get {} set { /* INPC stuff */ } } 

Bind à la propriété de commande dans le XAML usercontrol du bouton.

Le modèle de vue parent peut affecter une commande à la propriété lorsqu'il crée le modèle de vue enfant. Vous pouvez lier une propriété parent vm à SelectedIndex dans le contrôle onglet et la commande créée par le parent peut définir la propriété viewmodel parent liée.

Si vous n'utilisez pas MVVM complet et qu'il n'y a pas de modèle de vue enfant pour usercontrol, faites de la propriété command une propriété de dépendance de la commande usercontrol et liez-la à une propriété command viewmodel parent dans la fenêtre XAML.

+0

J'ai essayé de faire quelque chose comme ça mais je n'ai jamais réussi à le faire fonctionner. Il me dit toujours que le UserControl ou la fenêtre sont null. Je pense que c'est causé par l'ordre dans lequel ils sont créés. – Fred

+0

@Fred Cela semble facile à résoudre. Voyons le code. –