2012-08-15 5 views
6

Ich habe eine Anwendung, wo Sie zwischen verschiedenen Objekten in einer ListBox auswählen können. Wenn Sie ein Objekt auswählen, wird das Ansichtsmodell für ein Steuerelement geändert. Das Steuerelement verwendet das Timeline-Steuerelement von CodePlex und aus diesem Grund habe ich das StartDate und das EndDate für die Timeline-Daten, die an ViewModel gebunden sind. Wenn das Ansichtsmodell verändert aus, bekomme ich manchmal einen Fehler:OnPropertyChange Firing Order

ArgumentOutOfRangeException: MaxDateTime cannot be less then MinDateTime 

Dies tritt nur auf, wenn ich von einem späteren Zeitpunkt zu einem frühen Zeitpunkt zu gehen. Ich bin mir ziemlich sicher, dass dies auf die Art und Weise zurückzuführen ist, wie die Eigenschaften automatisch auf die Ansicht aktualisiert werden. Dies ist das relevante XAML. diese

MaxDateTime="{Binding Path=RecordingEnd}" 
MinDateTime="{Binding Path=RecordingStart}" 
CurrentDateTime="{Binding Path=CurrentDateTime, Mode=TwoWay}" 

Das Ansichtsmodell hat:

 private int myObjectIndex; 
     public int MyObjectIndex 
     { 
      get { return myObjectIndex; } 
      set { myObjectIndex = value; OnPropertyChanged("MyObjectIndex"); MyObject = MyObjects[myObjectIndex]; } 
     } 

     private MyObjectViewModel myObject=new MyObjectViewModel(); 

     public MyObjectViewModel MyObject   { 
      get { return myObject; } 
      set 
      { 
       myObject= value; 
       OnPropertyChanged("MyObject"); 
      } 
     } 

Gibt es einen Weg, um dieses Problem? Gibt es eine Möglichkeit, WPF mitzuteilen, in welcher Reihenfolge die Parameter in einem Objekt aktualisiert werden sollen?

Update: Ich landete mit einer Variation von @ colinsmith Antwort:

public MyObjectViewModel MyObject { 
    get { return myObject; } 
    set 
    { 
     myObject= new MyObjectViewModel(); 
     OnPropertyChanged("MyObject"); 

     myObject= value; 
     OnPropertyChanged("MyObject");  
    } 
} 
+0

Ich gehe davon aus den drei Definitionen sind nicht in dieser Reihenfolge? Und kannst du klarstellen, "wenn das ViewModel ausgetauscht wird", was du mit "verändert" meinst? –

+0

Wenn Sie ein Element auf der Benutzeroberfläche auswählen, wird das Objekt aktualisiert und aktualisiert. – Paparazzi

+0

Nur aus Neugier, können Sie versuchen, ändern Sie die Reihenfolge, die Sie die Eigenschaften CurrentDateTime = MinDateTime = MaxDateTime = ... die Reihenfolge wahrscheinlich wichtig ... d. Ihre Datumsbereiche unterscheiden sich in verschiedenen Modellen. Wenn die Modelldaten in die Eigenschaften ... eingegeben werden, müssen sie gültig sein, während sie die Eigenschaften aktualisieren, z. CurrentDateTime muss im Min/Max-Bereich sein .... und Max muss größer sein als mindatetime –

Antwort

1

Könnten Sie dies versuchen:

public MyObjectViewModel MyObject   { 
      get { return myObject; } 
      set 
      { 
       myObject=null; 
       OnPropertyChanged("MyObject"); 

       myObject= value; 
       OnPropertyChanged("MyObject"); 
      } 
     } 
+0

Ich musste zuvor einen ähnlichen Ansatz verwenden - es stellt sicher, dass alle Bindungen mit dem Nullwert aktualisiert werden, bevor der neue Wert angewendet wird. – Charleh

+0

Wenn Sie sich meine bearbeitete Frage ansehen, werden Sie feststellen, dass ich das Objekt wegen einiger anderer Verweise auf eine leere Instanz anstelle von null setzen musste. Das hat aber sehr gut funktioniert. – jle

+0

@jle .... Ist das so, dass Binding-Fehler nicht in Ihrem Ausgabefenster angezeigt werden, während es im Nullzustand ist? Nur ein Vorschlag...Sie könnten ein "statisches" leeres MyObject in Ihrem MyObject definieren und auf dieses verweisen, anstatt jedes Mal ein neues zu erstellen. –

0

Sie entweder die Tatsache umgehen konnten, dass eine min Datumzeit vor dem max Datatime aktualisiert werden kann und etwas ungültig (dh Deferr Einstellung vornehmen das Maximum oder das Minimum, bis sowohl das Maximum als auch das Minimum aktualisiert werden. Das könnte sehr fehleranfällig sein. Oder Sie können Max und Min den gleichen Wert zuweisen, damit sie nur zur gleichen Zeit aktualisiert werden können. z.B. anstatt RecordingEnd und RecordingStart haben RecordingSpan, die sowohl die max und min drin hat.

+0

Ich bin mir nicht sicher, was Sie mit RecordingSpan meinen? Die Zeitleistensteuerung mit dem Fehler ist Teil einer Bibliothek. – jle