应用程序在INotifyPropertyChanged事件调用时挂起

时间:2012-03-01 22:04:34

标签: wpf data-binding mvvm inotifypropertychanged

我的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%的CPU使用率(有时没有CPU使用率,但其他错误,如GridView控件中的错误数据)。

调试时我发现了一些事实:

1)如果在OnPropertyChanged之前暂停,OnCreateTable()和数据绑定工作正常:

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

2)OnCreateTable()和数据绑定工作正常,如果用“跳过”跟踪它(因为这会在OnPropertyChanged之前暂停)

我无法理解为什么我需要在OnPropertyChanged之前暂停。

2 个答案:

答案 0 :(得分:1)

尝试设置公共属性。这是一种影响,但评论太多了。

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

DT = // creating new table here

答案 1 :(得分: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()的调用,则所有都可以正常工作!