приложение зависает при вызове события INotifyPropertyChanged - PullRequest
0 голосов
/ 02 марта 2012

У меня странная проблема в моем приложении WPF. Я использую шаблон MVVM, и это часть моего MainWindowViewModel:

// 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 () и данных работают нормально, если трассировать их с помощью «step over» (потому что это делает паузу перед OnPropertyChanged)

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

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Попробуйте установить публичную собственность.Это вид досягаемости, но слишком много для комментариев.

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

DT = // creating new table here
0 голосов
/ 02 марта 2012

Я думаю, что нашел проблему.Извините, я забыл, что добавил проверку имени свойства:

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 (), все будет работать правильно!

...