WPF MVVM: Lier un ViewModel différent à chaque TabItem?

J’ai une fenêtre principale avec un contrôle onglet contenant 2 tabItem s:

Fenêtre principale

J’ai actuellement 1 ViewModel qui services Tab1 & Tab2. Ce ViewModel est en train de devenir un peu gonflé par un SOC flou. Je veux diviser la logique en 2 modèles de vue: ViewModel 1 & ViewModel2. Si j’ai bien compris, vous pouvez définir le DataContext fenêtre DataContext sur un ViewModel de base contenant une collection de ViewModels, puis d’affecter chaque TabItem à un ViewModel différent.

Les exemples que j’ai vus de ces ViewModels de base exposent une ObservableCOllection comme ceci:

 private ObservableCollection _viewModelCollection Public Observable Collection ViewModelCollection { get { return _viewModelCollection; } set { _viewModelCollection = value; OnPropertyChanged("ViewModelCollection"); } } public BaseViewModel() { ViewModelCollection = new ObservableCollection(); ViewModelCollection.Add(new ViewModel1(Tab1); ViewModelCollection.Add(new ViewModel1(Tab2); } 

Mais comment atsortingbuer un ViewModel différent à chaque TabItem? Je voudrais Tab1 = ViewModel1 & Tab2 = ViewModel2?

Vous pouvez en effet append les modèles de vue pour vos tabs à un modèle de vue principale. Vous pouvez ensuite établir une liaison avec les modèles de vue enfant dans le code XAML pour vos tabs.

Supposons que vous ayez trois modèles de vues: Tab1ViewModel , Tab2ViewModel et Tab2ViewModel . Sur votre MainViewModel vous conservez une collection de vos modèles de vue par onglet:

 class MainViewModel { ObservableCollection _children; public MainViewModel() { _children = new ObservableCollection(); _children.Add(new Tab1ViewModel()); _children.Add(new Tab2ViewModel()); } public ObservableCollection Children { get { return _children; } } } 

Après avoir défini le DataContext de votre fenêtre principale sur votre MainViewModel vous pouvez lier le DataContext de vos tabs en référençant la propriété Children :

         

J’utilise un framework tel que Prism, qui vous permet de définir des régions et d’utiliser RegionManager . Vous pouvez ensuite définir un ContentControl tant que ‘ui’ pour TabItem

Vous pouvez ensuite utiliser RegionManager.RequestNavigate pour renseigner une région nommée avec une vue particulière (et nos vues importent un modèle de vue et définissent leur contexte de données).

 class MainViewModel { ObservableCollection _children; public MainViewModel() { _children = new ObservableCollection(); _children.Add(new Tab1ViewModel()); _children.Add(new Tab2ViewModel()); } public ObservableCollection Children { get { return _children; } } } 

Maintenant, en XAML, liez les enfants à ItemsSource. Il générera chaque onglet pour chaque modèle de vue ajouté à la collection observable.