2012-08-15 10 views
6

私は、ListBox内のさまざまなオブジェクト間で選択できるアプリケーションを用意しています。オブジェクトを選択すると、コントロールのビューモデルが変更されます。コントロールはCodePlexのタイムラインコントロールを活用しています。そのため、私はViewModelにバインドされたタイムラインデータのStartDateとEndDateを持っています。 ViewModelが変更されると、時々エラーが発生します。OnPropertyChange発注の変更

ArgumentOutOfRangeException: MaxDateTime cannot be less then MinDateTime 

これは、後日から前の日付に移動した場合にのみ発生します。私は、プロパティがビューに自動的に更新される方法によるものだと確信しています。これは関連するXAMLです。

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

ViewModelには、これを持っている:

 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"); 
      } 
     } 

は、この問題を回避する方法はありますか?オブジェクト内のパラメータを更新する順序をWPFに指示する方法はありますか?

アップデート: 私は@のcolinsmithの応答の変化を使用して終了:

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

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

を私は3つの定義の順になっていないと仮定していますか?そして、「ViewModelが変更されたときに」「変更された」ということを明確にすることはできますか? –

+0

UIからアイテムを選択すると、そのアイテムが原因で更新されますか? – Paparazzi

+0

ちょうど好奇心から、プロパティを設定する順序を変更することはできますか?CurrentDateTime = MinDateTime = MaxDateTime = ...その順序はおそらく重要です。あなたの日付範囲は異なるモデルで異なります....モデルデータがプロパティに設定されているとき...プロパティを更新している間は有効である必要があります。 CurrentDateTimeはmin/maxの範囲にある必要があります....そしてmaxはmindatetimeより大きい必要があります –

答えて

1

あなたはこの試みることができる:

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

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

私はこれまで同様のアプローチを使用しなければなりませんでした。新しい値が適用される前にすべてのバインディングがnull値で更新されることを保証します。 – Charleh

+0

私の編集した質問を見ると、他の参照があるため、オブジェクトをnullではなく空のインスタンスに設定する必要があることがわかります。しかしこれは非常にうまくいった。 – jle

+0

@jle ....それで、ヌル状態になっている間に出力ウィンドウにバインディングエラーが表示されないのですか?ちょっとした提案...MyObject内に「静的な」空のMyObjectを定義し、毎回新しいMyObjectを作成する代わりにそのMyObjectを指すことができます。 –

0

あなたが最小日時が最大datatime前に更新することができるという事実を処理し、無効な何かを作ることができるのいずれか(すなわちdeferr設定maxとminの両方が更新されるまでの最大値または最小値)。それは非常にエラーを起こす可能性があります。または、最大値と最小値を同じ値にして、同時に更新できるようにすることもできます。例えばRecordingEndRecordingStartの代わりにRecordingSpanがあり、最大値と最小値の両方があります。

+0

私はあなたがRecordingSpanの意味をよく理解していませんか?エラーのあるタイムラインコントロールはライブラリの一部です。 – jle

関連する問題