我的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之前暂停。
答案 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()的调用,则所有都可以正常工作!