Méthode d’appel à partir d’un autre problème de fenêtre (classe)

Dans le code derrière le fichier de la fenêtre principale de l’application WPF, j’ai une méthode qui interroge une firebase database avec LINQ to SQL et écrit les résultats dans un ObservableCollection:

public void GetStateByDate(ssortingng shcode) { MydbDataContext contextSts = new MydbDataContext(); _ShAvaQuCollection.Clear(); var sts = from p in contextSts.SAties where p.ShID == shcode select p; foreach (var p in sts) _ShAvaQuCollection.Add(new ShAvaQu { ShCode = p.ShID, SiID = p.SiID, PrCat = p.PrCat }); } 

Lorsque j’appelle cette méthode à partir du même code derrière le fichier (la même fenêtre), tout va bien.

Si j’appelle cette méthode depuis une autre fenêtre, en utilisant un instanse de la fenêtre principale, ObservableCollection rest vide .:

 SWindow sw = new SWindow(); sw.GetStateByDate(ssortingngpar); 

Quelle est la raison pour ça? Dans ce cas, la méthode crée-t-elle une autre instance de ObservableCollection?

(Je peux voir dans le débogueur que sw._ShAvaQuCollection contient des valeurs. Est-ce que sw._ShAvaQuCollection n’est pas le même instans de collection que _ShAvaQuCollection ? Si oui, comment il peut être résolu?)

Edité (ajouté)

The ObservableCollection a déclaré ceci:

  ObservableCollection _ShAvaQuCollection = new ObservableCollection(); public ObservableCollection ShAvaQuCollection { get { return _ShAvaQuCollection; } } public class ShAvaQu { public ssortingng ShCode { get; set; } public ssortingng SiID { get; set; } public int PrCat { get; set; } } 

J’appelle la méthode depuis une fenêtre, où une autre collection ShQuCollection affichée via ListView. Dans le gestionnaire d’événement SelectionChanged, je prends un argument pour cette requête de firebase database:

 private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) { SWindow sw = new SWindow(); ssortingng str = sw.ShQuCollection[ShSelList.SelectedIndex].ShCode; sw.GetStateByDate(str); Close(); } } 

1) Plus important encore, vous ne devriez pas appeler la logique de firebase database depuis vos fenêtres / formulaires. Vous devriez le résumer dans une autre classe. Ensuite, vous pourriez demander à votre méthode de renvoyer une collection observable.

Cependant, dans votre cas, je suppose que vous essayez d’utiliser le formulaire secondaire pour recharger / charger la collection et que vous souhaitez qu’il soit utilisé dans votre formulaire principal. Le problème avec ceci est que vous créez une nouvelle instance du formulaire afin que votre collection soit remplie mais pas sur votre formulaire principal mais sur une copie.

Vous pouvez essayer de contourner ce problème de plusieurs manières.

1) Faites en sorte que la méthode et votre collection observable soient statiques de manière à mettre à jour une seule instance.

2) Passez un descripteur d’instance de votre formulaire principal dans votre formulaire secondaire afin de pouvoir réutiliser l’instance déjà existante. Cela serait préférable pour ne pas créer de nouvelles instances partout.

Dans le constructeur du second formulaire, vous pouvez passer dans l’instance de votre fenêtre principale afin de pouvoir l’utiliser directement. Cela devrait résoudre votre problème.

UPDATE: Voici quelques exemples de code. Fondamentalement, il existe de nombreuses façons de transmettre une référence.

Vous pouvez le faire comme ceci avec un constructeur:

 // This is the constructor for your second window private Window _parentHandle; public SecondWindow(Window obj) { this._parentHandle = obj; } 

Ensuite, à partir de votre formulaire principal contenant la méthode, vous ouvrirez cette fenêtre comme ceci.

 SecondWindow w = new SecondWindow(this); w.Show(); 

Maintenant, votre deuxième fenêtre a un handle direct sur votre première fenêtre afin que vous puissiez appeler votre méthode sur cette variable et celle-ci sera mise à jour.

Une autre méthode consiste à avoir une méthode Setter publique sur votre deuxième fenêtre.

 public Window ParentContext { get { return this._parentHandle; } set { this._parentHandle = value; } } 

Ensuite, vous pouvez créer votre instance de formulaire comme ceci:

 SecondWindow w = new SecondWindow(); // so just like normal w.ParentContext = this; // set the instance to the calling form w.Show(); 

C’est la base. Ce type de scénario fonctionne dans presque tous les scénarios dans lesquels vous devez transmettre une référence.

J’espère que cela pourra aider.