Ligação "Cascade" em ObservableCollection, contendo outros ObservableCollection

Tenho um projeto em que preciso exibir uma lista de contratos (Class Affaire). Cada contrato possui uma lista de fases (Fase de Classe). Eu exibo cada um deles em 2 ListView diferentes usando a ligação. O problema é quando eu removo uma fase do ListView, nem o ListView onde são exibidas as fases, nem meu ObjectCollection são atualizados.

Eu criei um contexto com dois ObservableCollection distintos:

ObservableCollection, onde está a lista de Affaire. ObservableCollection que são lista de fases presentes no Affaire selecionado

Meu contexto é feito da seguinte maneira:

public class Contexte : INotifyPropertyChanged
    {
        private Affaire selectedAffaire;
        private Phase selectedPhase;
        private Assemblage selectedAssemblage;
        public Affaire SelectedAffaire
        {
            get { return selectedAffaire; }
            set
            {
                selectedAffaire = value;
                this.NotifyPropertyChanged("SelectedAffaire");
            }
        }
        public Phase SelectedPhase
        {
            get { return selectedPhase; }
            set
            {
                selectedPhase = value;
                this.NotifyPropertyChanged("SelectedPhase");
            }
        }
        public Assemblage SelectedAssemblage
        {
            get { return selectedAssemblage; }
            set
            {
                selectedAssemblage = value;
                this.NotifyPropertyChanged("SelectedAssemblage");
            }
        }
        private ObservableCollection<Affaire> listeDesAffaires;
        public ObservableCollection<Affaire> ListeDesAffaires
        {
            get { return listeDesAffaires; }
            set { NotifyPropertyChanged(ref listeDesAffaires, value); }
        }
        /**************************************************/

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string nomPropriete)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
        }

        private bool NotifyPropertyChanged<T>(ref T variable, T valeur, [CallerMemberName] string nomPropriete = null)
        {
            if (object.Equals(variable, valeur)) return false;

            variable = valeur;
            NotifyPropertyChanged(nomPropriete);
            return true;
        }

    }

My Class Affaire:

public class Affaire : INotifyPropertyChanged
    {
        public long ID { get; set; }
        private string nom;
        public string Nom
        {
            get { return this.nom; }
            set
            {
                if (this.nom != value)
                {
                    this.nom = value;
                    this.NotifyPropertyChanged("Nom");
                }
            }
        }
        private string code;
        public string Code
        {
            get { return this.code; }
            set
            {
                if (this.code != value)
                {
                    this.code = value;
                    this.NotifyPropertyChanged("Code");
                }
            }
        }
        private string comm;
        public string Comm
        {
            get { return this.comm; }
            set
            {
                if (this.comm != value)
                {
                    this.comm = value;
                    this.NotifyPropertyChanged("Comm");
                }
            }
        }
        private ObservableCollection<Phase> listPhases;
        public ObservableCollection<Phase> ListPhases {
            get { return listPhases; }
            set
            {
                listPhases = value;
                if (PropertyChanged != null)
                {
                    NotifyPropertyChanged("ListPhases");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    ....
    }

Minha classe Fase:

public class Phase : INotifyPropertyChanged
    {
        private string nomPhase;
        public string NomPhase
        {
            get { return this.nomPhase; }
            set
            {
                if (this.nomPhase != value)
                {
                    this.nomPhase = value;
                    this.NotifyPropertyChanged("NomPhase");
                }
            }
        }
        private int priorite;
        public int Priorite
        {
            get { return this.priorite; }
            set
            {
                if (this.priorite != value)
                {
                    this.priorite = value;
                    this.NotifyPropertyChanged("Priorite");
                }
            }
        }
        private string commPhase;
        public string CommPhase
        {
            get { return this.commPhase; }
            set
            {
                if (this.commPhase != value)
                {
                    this.commPhase = value;
                    this.NotifyPropertyChanged("CommPhase");
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
        public long IdAffaire { get; set; }
        public long ID { get; set; }
        private ObservableCollection<Assemblage> listAssemblages;
        public ObservableCollection<Assemblage> ListAssemblages
        {
            get { return listAssemblages; }
            set
            {
                listAssemblages = value;
                if (PropertyChanged != null)
                {
                    NotifyPropertyChanged("ListAssemblages");
                }
            }
        }
    ...
    }

1) Quando clico duas vezes em um contrato (no ListView1), mostro na lista do ListView2 suas fases, faço o seguinte:

contexte.SelectedAffaire = (Affaire)ListView1.SelectedItem;
contexte.SelectedAffaire.getListPhases();
afficherListview("2");

2) Quando edito minha Fase, tudo é atualizado corretamente na minha opinião e também na minha ObservableCollection

3) Para adicionar / remover uma nova fase, tudo está resolvido.

Editar:

O exemplo dado pela Netstep funciona perfeitamente, mas ainda encontro um problema:

Eu tenho um terceiro nível "Assembly", este é um ObservableCollection na classe "Phase", não tenho problemas para navegar com os quatro ListViews, mas encontro um problema quando quero fazer outra coisa: Quando clico com o botão direito do mouse no cabeçalho de "Phase", quero exibir na lista de Assembly, a lista de todos os assemblies contidos no Affaire, sem filtrar em Phase. Para isso, faço o seguinte: Estou no Assemblies de exibição de lista de terceiro nível, clico com o botão direito do mouse no cabeçalho Phase e o evento é o seguinte:

Phase ph = new Phase();
                ph.IdAffaire = contexte.SelectedAffaire.ID;
                ph.ListAssemblages = new ObservableCollection<Assemblage>(contexte.SelectedAffaire.getListAssemblages(true));
                contexte.SelectedPhase = ph;

Eu "cago" um pouco fazendo uma nova fase vazia, apenas para colocar um ObservableCollection dentro e vincular o ObservableCollection ao meu ListView3.Editar: Essa parte do código funciona bem ... Acabei de atualizar o contexto em algum lugar do meu código e esqueci, certo de que havia algo errado no processo de licitação ... Tudo resolvido, obrigado

questionAnswers(1)

yourAnswerToTheQuestion