2016-05-19 5 views
0

Ich habe ein Viewmodel-Objekt, das wir MyVM für jetzt aufrufen. Es enthält eine Liste von Datenobjekten (beispielsweise vom Typ MyData, es hat eine List<MyEntry> Eigenschaft) namens AllDataObjects und hat eine Eigenschaft CurrentSelection, die das aktuell ausgewählte Datenobjekt aus seiner Liste zurückgibt.BindingSource für GridControl auf einer Eigenschaft mit wechselnden Instanzen

Der Mechanismus verantwortlich für die ausgewählte Element Werke zu ändern und weist ein anderes MyData Objekt von AllDataObjects zur CurrentSelection Eigenschaft.

Jetzt habe ich eine DevExpress GridControl, die eine DataBinding bezieht sich auf MyVM.CurrentSelection.ListOfEntries. Wenn ich das jedoch aufstelle, wird die Bindung immer auf das erste zugewiesene Element zeigen, denn wenn CurrentSelection eine neue MyData Objektinstanz erhält, kennt die Bindung nur noch die Referenz auf das alte Objekt.

Gibt es eine Möglichkeit, wie ich mein Grid an diese geschachtelte Eigenschaft binden kann, ohne dieselbe MyData Instanz, die in CurrentSelecton immer wieder gespeichert ist, zurücksetzen und neu initialisieren zu müssen?

Antwort

0

Ich schaffte dies, indem ich die Schnittstelle INotifyPropertyChanged implementieren lassen und das UserControl, das mein Grid hält, auf sein PropertyChanged Ereignis hören.

public class MyVMClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(String propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public List<MyData> AllDataObjects { get; set; } 

    private MyData CurrentSelection_ { get; set; } 
    public MyData CurrentSelection 
    { 
     get { return CurrentSelection_; } 
     set 
     { 
      CurrentSelection_ = value; 
      OnPropertyChanged(nameof(CurrentSelection)); 
     } 
    } 


    public MyVM(List<MyData> allDataObjects) 
    { 
     AllDataObjects = allDataObjects; 
    } 
} 

und innerhalb der UserControl ‚s-Code:

public void Initialize(MyVMClass myVM) 
    { 
     MyVM = myVM; 
     MyVM.PropertyChanged += MyVM_PropertyChanged; 
     MyVM_PropertyChanged(); 
    } 

    private void MyVM_PropertyChanged(object sender=null, PropertyChangedEventArgs e=null) 
    { 
     if (e == null || e.PropertyName == nameof(MyVMClass.CurrentSelection)) 
     { 
      MyBindingSource.DataSource = MyVM.CurrentSelection.ListOfEntries; 
     } 
    }