在我的WPF项目中,我使用的是PropertyGrid。我设置了SelectedObject,数据可以正确显示。
我还添加了以下内容以允许:如果用户更改了SelectedObject中某个属性的值,则会隐藏一些属性并显示其他属性
PropertyDescriptorCollection pdcSld = TypeDescriptor.GetProperties(this.sld.GetType());
PropertyDescriptor descriptorF0 = pdcSld["f0Sld"];
PropertyDescriptor descriptortcStar = pdcSld["tcStarSSld"];
PropertyDescriptor descriptorGammaI = pdcSld["gammaI"];
PropertyDescriptor descriptorSpectrum = pdcSld["spectrum"];
if (descriptorF0 != null)
{
BrowsableAttribute attrib = (BrowsableAttribute)descriptorF0.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrow = attrib.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
isBrow.SetValue(attrib, true);
}
if (descriptortcStar != null)
{
BrowsableAttribute attrib = (BrowsableAttribute)descriptortcStar.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrow =
attrib.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
isBrow.SetValue(attrib, true);
}
if (descriptorGammaI != null)
{
BrowsableAttribute attrib = (BrowsableAttribute)descriptorGammaI.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrow =
attrib.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
isBrow.SetValue(attrib, false);
}
if (descriptorSpectrum != null)
{
BrowsableAttribute attrib = (BrowsableAttribute)descriptorSpectrum.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrow =
attrib.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
isBrow.SetValue(attrib, false);
}
当我打开显示PropertyGrid的窗口时,一切都按预期工作,即某些值会根据某个属性的值显示或隐藏。
如果用户在PropertyGrid中更改了该值,则会调用代码,但网格不会刷新并保持原来的状态。
我也试过添加
[RefreshProperties(RefreshProperties.All)]
在可以提升网格刷新的属性之前(更改可见性),但它不起作用。
我错过了什么?