Bonjour,

Je sais le titre n'est pas très clair, mais moi-même je suis un peu dans le flou.

Voilà j'ai une entité Stock, qui est une relation 0,n -- 0,n, pointant vers un Produit d'un côté, et un Entrepôt de l'autre, et définissant quelle quantité d'un produit on a dans quel entrepôt.

Grâce à une fenêtre modale l'utilisateur peut sélectionner un Produit dans un ComboBox, rempli par une ObservableCollection<Produit> (enfin par la ListCollectionView qui en est tirée pour être précis). Préalablement pour remplir cette collection, on fait une recherche à partir de ce que l'utilisateur a saisi dans une TextBox, ainsi :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void textBoxRechercheProduit_KeyUp(object sender, KeyEventArgs e)
{
    //Si l'utilisateur vide de lui-même la textbox, on réinitialise la recherche
    if (String.IsNullOrEmpty(textBoxRechercheProduit.Text) && this._collectionProduits != null)
    {
        this._collectionProduits.Clear();
        buttonResetSearch.IsEnabled = false;
    }
 
    string textSearch = textBoxRechercheProduit.Text.Trim().ToLower();
    buttonResetSearch.IsEnabled = true;
 
    //On effectue la recherche à partir de 3 lettres au minimum
    if (textSearch.Length < 3)
        return;
 
    //Entity ne supporte pas le mot-clef "Contains" sur les entités, donc on doit utiliser "Except"
    //On cherche les produits non présents dans l'entrepôt dont le nom/l'identifiant correspond à la recherche
    IQueryable<Produit> queryProduits = from pro in entities.Produit.Except(this._produitsAlreadyInEntrepot)
                                        where pro.IsActive && (pro.NomProduit.ToLower().Contains(textSearch) || pro.IdentifiantProduit.ToLower().Contains(textSearch))
                                        select pro;
 
    this._collectionProduits.Clear();
    foreach (Produit item in queryProduits)
        this._collectionProduits.Add(item);
}
Dès que l'utilisateur choisi un des Produit de la liste, l'entité Stock qui est une propriété privée de la fenêtre, est liée à celui-ci, ainsi :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
private void listBoxProduits_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (listBoxProduits.SelectedIndex == -1)
        return;
 
    monStock.Produit = listBoxProduits.SelectedItem as Produit;
}
Mais si jamais l'utilisateur refait une recherche, et que la collection de produits est vidée (this._collectionProduits.Clear(); ), la référence vers le produit est perdue pour le Stock (qui perd aussi son Entrepôt au passage).

Et c'est là que je ne comprends pas... La propriété "Produit" de l'objet Stock devrait pointée vers le Produit au-delà de la collection, non?

Ou alors il y a une notion de programmation objet que j'ai mal saisie... Ou alors c'est une notion d'Entity Framework que j'ai mal saisie...

Merci à ceux qui pourront m'éclairer.