是你控制的类型吗?你可以添加一对FooUpdating
/FooUpdated
事件?另一种选择是用TypeDescriptionProvider
编写一个自定义属性模型,但我怀疑这将是相当多的工作。我第一次尝试将是一个前/后对...
喜欢的东西(更新以显示3.5的办法;看历史2.0为例):
class MyType : INotifyPropertyChanged, INotifyPropertyChanging
{
public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangingEventHandler PropertyChanging;
protected void UpdateField<T>(ref T field, T newValue, string propertyName)
{
if (!EqualityComparer<T>.Default.Equals(field, newValue))
{
OnPropertyChanging(propertyName);
field = newValue;
OnPropertyChanged(propertyName);
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this,
new PropertyChangedEventArgs(propertyName));
}
protected void OnPropertyChanging(string propertyName)
{
PropertyChangingEventHandler handler = PropertyChanging;
if (handler != null) handler(this,
new PropertyChangingEventArgs(propertyName));
}
private string name;
public string Name
{
get { return name; }
set { UpdateField(ref name, value, "Name"); }
}
private DateTime dateOfBirth;
public DateTime DateOfBirth
{
get { return dateOfBirth; }
set { UpdateField(ref dateOfBirth, value, "DateOfBirth"); }
}
}
然后,只需处理这两个事件,并启用/根据需要禁用更新。
在.NET 3.5或更高版本上,实现框架定义的INotifyPropertyChanging接口而不是创建自定义PropertyChanging事件将会很整齐。这样可以避免不必要的扩散,并可能更好地发挥框架定义的功能(如数据绑定)的作用。 – itowlson 2009-10-10 21:27:06
非常有效的一点。编辑更新。 – 2009-10-10 21:57:58
感谢您的回答 - 我会看到需要付出多少努力(我有很多不同的对象类型,包含许多必须编辑的属性才能完成此操作)。 与此同时,我通过限制PropertyGrid刷新来缓解问题,使它们每25毫秒只能发生一次。这个速度足够快,对用户来说不是很明显,而且似乎可以通过大量的Refresh()请求“一起堆叠”来解决问题。 – 2009-10-10 23:51:24