私は契約のリスト(クラスAffaire)を表示する必要があるプロジェクトを持っています。 各契約にはフェーズの一覧があります(クラスフェーズ)。 バインディングを使用して2つの異なるListViewにそれぞれを表示します。 問題は、ListViewからフェーズを削除したり、Phasesが表示されているListView、またはObjectCollectionが更新されていない場合です。他のObservableCollectionを含むObservableCollectionの "Cascade"バインディング
のObservableCollection、アフェールのリストです:
は、私は2つの異なるのObservableCollectionでコンテキストを作成しました。選択アフェール中に存在する相の一覧です のObservableCollection 私のコンテキストは次のように行われる:
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;
}
}
私のクラスアフェール:
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));
}
....
}
私のクラスのフェーズ:
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)契約書(ListView1)をダブルクリックすると、その相のListView2リストで、私は次のようにします。私は私のフェーズを編集する場合
contexte.SelectedAffaire = (Affaire)ListView1.SelectedItem;
contexte.SelectedAffaire.getListPhases();
afficherListview("2");
2)、すべてが)私の見解であり、また私のObservableCollection
3に正しく更新されて追加/削除のために新しい段階、すべてが解決されます。
編集:Netstepで与え
例は完璧に動作しますが、私はまだ問題を満たす:
私は第3レベル「アセンブリ」を持っている、これはクラス「フェーズ」でのObservableCollectionで、私が持っています4つのリストビューでナビゲートするのに問題はありませんが、何か他のものを作成したいときに問題が発生します。「フェーズ」のヘッダを右クリックすると、アセンブリのリスト、すべてのアセンブリのリストフェーズでフィルタリングせずに、Affaireに含まれています。私は次のようにします。このため :私は右のフェーズヘッダやイベントをクリックして作る、第3レベルのリストビューアセンブリの午前には、以下の通りである:
Phase ph = new Phase();
ph.IdAffaire = contexte.SelectedAffaire.ID;
ph.ListAssemblages = new ObservableCollection<Assemblage>(contexte.SelectedAffaire.getListAssemblages(true));
contexte.SelectedPhase = ph;
I「たわごと」だけで、新しい空の位相を作るビットObservableCollectionを内部に配置し、ObservableCollectionをListView3にバインドします。 編集:ここではコードの一部は、良い作品...私はちょうどどこかに私のコードのコンテキストをリフレッシュし、それについて忘れてしまった、結着で何か問題があったことを確認してください...すべて解決おかげ
ohoh ...完璧な回答ありがとう、SelectedItemにバインドできるかどうかわかりませんでした。私はフェーズを削除/追加するために、私はちょうどSelectedAffaire.ListeDesPhases.Add(MyPhase)、またはSelectedAffaire.ListeDesPhases.Remove(MyPhase)として何かする必要があると思いますか? ListViewAffaire.SelectedItem、ListViewSubPhase、ListViewPhase.SelectedItemなどのバインドでListViewPhaseバインドを使用してObservableCollectionを1つだけ使用します(実際には2つではなく4つのレベルになります) –
すみません、私はまだ会います私のポストを編集して^^ ' –
私は私の答えを編集し、同様のコードを実行するボタンを追加し、それはうまくいくでしょう。 – Netstep