web-dev-qa-db-fra.com

WPF Obtenir la fenêtre parent

Hy,

Dans mon fichier MainWindow.xaml.cs, j'ai créé un getter pour obtenir la référence à ma zone de liste.

public ListBox LoggerList
{
    get { return Logger; }
}    

Maintenant, je veux accéder à la LoggerList à partir d'une classe normale mais je ne travaille pas. J'ai essayé ce qui suit:

MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
object selectedItem = parentWindow.LoggerList;

Mais cela ne fonctionne que dans un fichier * xaml.cs et non dans un fichier * .cs normal.

Meilleures salutations

13
user2644964

Il existe plusieurs façons d'accéder à Windows dans WPF. Si vous en avez plusieurs ouverts, vous pouvez les parcourir comme suit:

foreach (Window window in Application.Current.Windows) window.Close();

Si vous aviez un type particulier de Window personnalisé, vous pouvez utiliser ceci:

foreach (Window window in Application.Current.Windows.OfType<YourCustomWindow>()) 
    ((YourCustomWindow)window).DoSomething();

Si vous êtes juste après une référence au MainWindow, alors vous pouvez simplement utiliser ceci:

Window mainWindow = Application.Current.MainWindow;

Cependant, en utilisant cette méthode, il est possible qu'elle renvoie null. Dans ce cas, assurez-vous que vous définissez MainWindow sur cette propriété dans son constructeur:

// From inside MainWindow.xaml.cs
Application.Current.MainWindow = this;

Il convient de noter cependant que @woutervs est correct ... vous devez pas accéder aux contrôles d'interface utilisateur à partir de Windows dans les classes de bibliothèque. Vous devez vraiment lier les collections de données au ListBox.ItemsSource, puis manipulez la collecte de données à la place.


MISE À JOUR >>

Je ne sais pas pourquoi ton Application.Current l'objet est null... cela pourrait être dû au fait que vous avez chargé votre bibliothèque de classes dans un autre AppDomain. Quoi qu'il en soit, je pense que vous manquez la vue d'ensemble. Il n'y a vraiment aucune raison pour qu'une classe de bibliothèque de classes ait besoin d'une référence au Window principal.

Si vous devez effectuer un travail sur la collecte de données, passez simplement la collecte de données à partir du code derrière ou de votre modèle de vue. Une fois le travail terminé, il vous suffit de le renvoyer à l'interface utilisateur où vous avez accès à ListBox et/ou à la collection qui est des données liées à la propriété ItemsSource.

17
Sheridan