我想有一个控件,如果另一个属性的值设置为特定值,则允许显示属性。以下是我想要的简化示例:
public class CustomButton : Control
{
private ButtonType _bType = ButtonType.OnOff;
private Int32 _minPress = 50; // 50 mS
public ButtonType Button_Type
{
get { return _bType; }
set { _bType = value; }
}
public Int32 Minimum_Press_Time // Only for momentary buttons
{
get { return _minPress; }
set { _minPress = value; }
}
}
public enum ButtonType
{
Momentary,
OnOff
}
在将CustomButton添加到Windows.Forms表单时,如果Button_Type更改为ButtonType.Momentary,则Minimum_Press_Time将仅显示在“属性”窗口中。
这样的事情可能吗?
答案 0 :(得分:1)
是的,它可能会接近,但看起来有点奇怪。我以前在一些控件上做过这个。以下是您需要做的完整示例:
public partial class CustomButton : Control
{
private ButtonType _buttonType = ButtonType.OnOff;
private CustomButtonOptions _options = new OnOffButtonOptions();
[RefreshProperties(System.ComponentModel.RefreshProperties.All)]
public ButtonType ButtonType
{
get { return _buttonType; }
set
{
switch (value)
{
case DynamicPropertiesTest.ButtonType.Momentary:
_options = new MomentaryButtonOptions();
break;
default:
_options = new OnOffButtonOptions();
break;
}
_buttonType = value;
}
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public CustomButtonOptions ButtonOptions
{
get { return _options; }
set { _options = value; }
}
public CustomButton()
{
InitializeComponent();
}
}
public enum ButtonType
{
Momentary,
OnOff
}
public abstract class CustomButtonOptions
{
}
public class MomentaryButtonOptions : CustomButtonOptions
{
public int Minimum_Press_Time { get; set; }
public override string ToString()
{
return Minimum_Press_Time.ToString();
}
}
public class OnOffButtonOptions : CustomButtonOptions
{
public override string ToString()
{
return "No Options";
}
}
所以基本上发生的事情是你使用ExpandableObjectConverter将抽象类型转换为一组选项。然后,使用RefreshProperties属性告诉属性网格在此属性更改后需要刷新属性。
这是我发现尽可能接近你所要求的最简单方法。属性网格并不总是以正确的方式刷新,因此有时在没有可扩展属性的选项集旁边会有一个“+”符号。使用属性中的“ToString”使属性网格上的显示看起来很智能。