Vous pouvez partager les données directement (c'est-à-dire transmettre la référence SelectedItem à la fenêtre enfant), mais cela ne vous aide pas à gérer le comportement et l'état sur plusieurs fenêtres. Si c'est une vue en lecture seule qui pose moins de problèmes, mais si les données sont modifiées, cela devient très problématique très rapidement.
Ceci est un bon exemple des avantages de l'utilisation d'un Model-View-? modèle. MVVM est généralement le modèle préféré pour WPF, car WPF est conçu pour une séparation complète de la présentation. Cependant, dans un cas comme celui-ci, vous voudrez peut-être quelque chose de plus proche de MVC (Model-View-Controller), car vous voulez vraiment coordonner le comportement et l'état entre les différents éléments de l'interface utilisateur.
Je recommanderais une approche hybride, appelons-la "MVVMC" juste pour rendre l'acronyme encore plus long et plus gênant. Implémentez un ViewModel complètement indépendant de l'interface utilisateur et qui expose simplement les données et l'état/comportement lié aux données - probablement principalement des trucs de type CRUD. Ensuite, implémentez un contrôleur spécifique à votre conception d'interface utilisateur qui consomme et expose (par délégation ou par composition) le ViewModel, mais encapsule. tous les comportement d'affichage multi-fenêtre - une fenêtre choses par faire respecter l'article, la propagation des demandes proches, etc.
public class MyViewModel : INotifyPropertyChanged, INotifyCollectionChanged
{
public MyViewModel(DataModel dataModel) { ... }
}
public class MyController
{
public MyController(MainWindow mainWindow, ViewModel viewModel) { ... }
public ViewModel { get { return _viewModel; } }
public ICommand DisplayChild { ... }
}
Donc ce que vous faites vraiment est de prendre une MVVM, puis inverser le contrôle de sorte que le contrôleur peut gérer l'interface utilisateur multi-fenêtres. Ainsi, le contrôleur ici injectera le ViewModel dans Windows (y compris le principal) en tant que DataContext pour faciliter la liaison. Il se lierait également aux événements de la fenêtre principale, lancerait des fenêtres enfants et se lierait probablement aux événements fenêtre enfant afin de les gérer correctement (par exemple une fenêtre par enregistrement enfant, fermer les enfants lors de la fermeture de la fenêtre principale, etc.).
Je voudrais aller un peu plus loin ici, en mettant en œuvre le contrôleur contre une interface au lieu de Windows. Cela vous donne une certaine flexibilité dans le refactoring, mais plus important encore, vous permet de tester votre contrôleur contre des simulacres.
public interface IControllerChild
{
public void Show();
public bool Activate();
public void Close();
// add other behaviors here
}
public class DetailWindow : Window, IControllerChild
{
// implement other behaviors here
}
public class MockControllerChild : IControllerChild
{
public void Show() { IsShowing = true; ActionLog.Add(MockControllerAction.Show); }
public void Activate() { IsShowing = false; ActionLog.Add(MockControllerAction.Activate); }
public void Close() { IsShowing = false; ActionLog.Add(MockControllerAction.Close); }
public bool IsShowing { get; private set; }
public IList<MockControllerAction> ActionLog { get; private set; }
// mock and record other behaviors here
}
public enum MockControllerAction
{
Show,
Activate,
Close,
// Add other behaviors here
};
Merci d'avoir pris le temps de fournir une réponse si détaillée. Je vais devoir examiner cela et digérer un peu plus; il me semble que c'est trop pour ce que je veux, mais je réalise que c'est une bonne pratique. – Nate
Accepter comme la meilleure réponse, cependant, dans mon cas, j'étais capable de simplement passer une référence à l'instance de va-et-vient et cela convenait à mes besoins. – Nate