2012-03-01 12 views
0

私のWPFアプリケーションに奇妙な問題があります。 私はMVVMパターンを使用していますし、これは私のMainWindowViewModelの一部です:INotifyPropertyChangedイベントが呼び出されたときにアプリケーションがハングアップする

// GridView control in MainWindow.xaml binded to this property 
public DataTable DT 
{ 
    get { return _dt; } 
} 

// INotifyPropertyChanged Member for refreshing bindings 
public void OnPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

// my function 
void OnCreateTable() 
{ 
    _dt = // creating new table here 
    OnPropertyChanged("DT"); // refresh binding 
} 

私はほとんどオールウェイズOnCreateTable()プログラムを呼び出すと(時々ようがないCPUの使用率が、他のエラーと100%のCPU使用率でハングアップしますGridViewコントロールのデータが正しくありません)。

私はいくつかの事実を発見デバッグ中:OnPropertyChangedを前に一時停止を行う場合

1)OnCreateTable()およびデータ・バインディングは、正常に動作:

void OnCreateTable() 
{ 
    _dt = // creating new table here 
    Thread.Sleep(1000); //!!! 
    OnPropertyChanged("DT"); // refresh binding 
} 

2)OnCreateTable()とデータバインディングトレース場合は正常に動作それは "ステップオーバー"(OnPropertyChangedの前に一時停止するので)です。

OnPropertyChangedの前に一時停止する必要がある理由を理解できません。

+0

スレッドが関与していますか? –

+0

いいえ、私はhavent。そのシンプルなアプリケーションはまだありません。 –

+0

データテーブルにはいくつの行がありますか?バインドせずにitemssourceを直接設定するとどうなりますか(テストのためだけ) – blindmeis

答えて

0

問題が見つかりました。私は理由を理解することはできません

public void OnPropertyChanged(string propertyName) 
{ 
    VerifyPropertyName(propertyName); 

    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

[Conditional("DEBUG")] 
    public void VerifyPropertyName(string propertyName) 
    { 
     // Verify that the property name matches a real, 
     // public, instance property on this object. 
     if (TypeDescriptor.GetProperties(this)[propertyName] == null) 
     { 
      throw new Exception("Invalid property!"); 
     } 
    } 

が、VerifyPropertyName()を呼び出すと、一時停止を必要とする、またはそれがそのバグになり、私が書いた:申し訳ありませんが、私は、プロパティ名のチェックが追加されていることを忘れてしまいました。 VerifyPropertyName()への呼び出しを削除すると、すべて正常に機能します!

1

publicプロパティを設定してみてください。それはリーチのようなものですが、コメントにはあまりにも多すぎます。

public DataTable DT 
{ 
    get { return _dt; } 
    set 
    { 
     if(_dt == value) return; 
     _dt = value; 
     OnPropertyChanged("DT"); 
    } 
} 

DT = // creating new table here 
+0

これは私が最初に作る方法です。しかし同じ結果もあります。それで、私はプロパティsetterのcallint OnPropertyChangedが私の問題を引き起こし、私の最初の投稿と同じようにすると考えました。 –

関連する問題