在Designer中:设置属性默认值,但在设置默认值时不调用属性?

我有一段代码如下:

[DefaultValue(false)] public bool Property { set { blah = value; someControl.Visible = value; } get { return blah; } } 

当我查看设计器中的属性时,属性设置为false(如果我使用它,则为true)。
但该物业并未实际设定。 控件的Visible值不会更改。

如何让设计师实际使用默认值设置属性?

[DefaultValue]属性只是设计者和序列化程序的提示。 完全取决于您确保属性中承诺的默认值实际上是属性的值。 在您的情况下不会调用属性setter,因为序列化程序检测到属性的当前值等于默认值,因此可以省略属性赋值。 这是一个优化,它使InitializeComponent()更小更快。

您只需在构造函数中初始化属性值即可确保这一点。 请注意控件的Visible属性默认为true。

两种选择;

  • 取走默认值(bool默认为false)
  • 使用ShouldSerialize *来说清楚

在后者,你可能想要一个布尔? 跟踪“显式集”与“隐式默认值”:

 private bool? property; public bool Property { set { property = value; someControl.Visible = value; } get { return property.GetValueOrDefault(); } } public void ResetProperty() { property = null; } public bool ShouldSerializeProperty() { return property.HasValue; } 

请注意,Reset *和ShouldSerialize *是组件模型识别的模式。