2011-07-21 10 views
3

私はMvvmLight v4(NuGet経由でインストールされた.NET 4ビルド、v4.0.0.0/BL0016)で発生している奇妙な小さなバグを持っています。私のプロジェクトでは、(ViewModelBaseを継承する)ビューモデルがキャンバスに描画されたビジュアル要素を表しています。このビューモデルには、一般的なTop/Left/Width/Heightプロパティがあり、それぞれRaisePropertyChangedを呼び出します。さまざまなイベントに応答してリリースビルドでRaisePropertyChangedエラーが発生しましたか?

public double Width 
{ 
    get { return _width; } 
    set 
    { 
     if (Math.Abs(_width - value) < DeltaEpsilon) 
     { 
      return; 
     } 

     _width = value; 
     RaisePropertyChanged(); 
    } 
} 

、ビューモデルは、視覚要素の位置と大きさを算出する方法を有しており、適切な特性を設定する:

public void CalculateSize() 
{ 
    Width = DoSomeCalculation(); 
    // Calculate other settings... 
} 

私はいくつかのユニットテストを持っています計算が正しく行われていることを確認する場所。デバッグモードで実行すると、テストは正常に実行されます。しかし、私はリリースモードで実行する場合、テストは以下の例外を除いて、失敗:

SetUp : System.InvalidOperationException : This method can only by invoked within a property setter. 
at GalaSoft.MvvmLight.ObservableObject.RaisePropertyChanged() 
at MyProject.ViewModels.TableViewModel.CalculateSize() in TableViewModel.cs: line 154 

どこTableViewModel上の線154は、幅= DoSomeCalculation()ラインです。言い換えれば、私のメソッドがプロパティの値を設定しようとすると、MvvmLightはプロパティセッター内からRaisePropertyChangedを呼び出していないと訴えます。私は(Reshaperのテストデバッガを使用して)テストをデバッグしようとしましたが、私がデバッガを実行すると、テストは合格します(おそらく、リリースモードであっても、Resharperでデバッグモードにユニットテストをデバッグします)。アプリケーション自体に

リリースモードがコードを壊す理由についてのアイデアはありますか?コンパイラがObservableObjectのRaisePropertyChanged()メソッドでStackTraceの使用を中断するコードを最適化する方法がありますか?上記の例外は、Widthセッターが入力されていることを示していないので、CalculateSizeメソッドから例外に直接ジャンプします。

+0

ナッツ、ちょうどhttp://mvvmlight.codeplex.com/workitem/7520を見つけました。それは私の問題です、確かに十分です。 –

答えて

3

MVVM Lightコードを見ると、RaisePropertyChanged()がStackTraceを使用してプロパティの名前を特定していることがわかります。これは、this postで説明されているように、リリースモードで問題になる可能性があります。

この問題を一周するために、異なるRaisePropertyMethodを使用してください - あなたは、次のいずれかの方法を使用することができます。

RaisePropertyChanged<YourClass>(x => x.Width); 

または

RaisePropertyChanged("Width"); 

どちらの方法は、プロパティの名前を決定するための別の方法を使用します変更されました(2番目のプロパティはプロパティ名を使用します)。

+0

私はすでに自分の問題の理由を示すリンクを投稿していますが、回避策を与えてから答えを出します:-) –

+0

リンクに問題があると表示されます。私のポストでは、実際に理由を説明している別のStackoverflow投稿を引用しています**なぜ**動作していません。私はLaurentにこの問題を指摘しました。彼の答えはhttp://twitter.com/LBugnion/status/94173507906318337です。 – AxelEckenberger