2012-03-01 3 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() программа почти ВСЕГДА вешает с 100% использованием процессора (иногда, без использования центрального процессора, но других ошибок как неверные данные в элементе управления GridView).

При отладке я обнаружил некоторые факты:

1) OnCreateTable() и привязки данных работают нормально, если делают паузы OnPropertyChanged:

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

2) OnCreateTable() и привязки данных работает нормально, если след он с «переходом» (потому что это делает паузу перед OnPropertyChanged)

Не могу понять, почему мне нужно сделать паузу перед OnPropertyChanged.

+0

У вас есть какие-либо темы? –

+0

Нет, у меня нет. Его простое приложение пока. –

+0

Сколько строк в вашем файле? и что произойдет, если вы установите directsource напрямую без привязки (только для тестирования) – 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 DataTable DT 
{ 
    get { return _dt; } 
    set 
    { 
     if(_dt == value) return; 
     _dt = value; 
     OnPropertyChanged("DT"); 
    } 
} 

DT = // creating new table here 
+0

Вот как я делаю в начале. Но с тем же результатом тоже. Затем я подумал, что callont OnPropertyChanged в свойстве свойств вызывает мою проблему и делает как на моем первом посту. –

Смежные вопросы