【发布时间】:2016-03-29 09:34:36
【问题描述】:
我面临的问题是,当我有一个具有这样的默认值的属性的类时:
public class Border {
public Border() {
InitializeAdornment();
}
[DefaultValue(true)]
public bool Visible {
get;
set;
}
private void InitializeAdornment() {
Visible = true;
// Some initialization code here that don't do anything with the property...
}
}
然后将其用作带有DesignerSerializationVisibility.Content 属性的UserControl 的属性,如下所示:
public class Label : HitAbleControl, IText, IBorder {
public Label() {
InitializeAdornments();
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Border Border {
get {
return __border;
}
set {
__border = value;
}
}
private Border __border;
private void InitializeAdornments() {
Border = new Border {
Visible = false
};
// Some initialization code here that don't do anything with the property...
}
}
如果我使用 Visual Studio 设计器设置 label1.Border.Visible = true,它不会被序列化,但在这种情况下,它的默认值应该是 false 而不是 true。
我知道我可以将Border 类更改为始终序列化,或者检查默认值是真还是假,但我想知道是否有类似ShouldSerialize[PropertyName] 的属性此序列化问题的属性或其他解决方法,无需更改序列化程序。
我搜索了几个小时试图解决这个问题,但没有求助于 CodeDomSerializer,或者至少理解了为什么视觉工作室设计师不序列化这个问题。
任何帮助将不胜感激,谢谢!
【问题讨论】:
-
你真的需要
Border属性可以公开设置吗? -
@Ivan Stoev 在我的原始代码中,Label 类实现了 INotifyPropertyChanged,为简单起见,我将其更改为仅在此处发布支持字段
-
INPC 不是必需的,我的问题是它是否可以从外部设置。通常当你有类实例时,你在构造函数内部设置它们,并且只让它们的属性可以从外部设置。我问是因为它是必不可少的。
-
用户应该能够将其设置为另一个 Border 实例(即来自另一个 UI 主题),而无需复制每个 Border 属性值,但无论如何,我尝试在没有设置器的情况下对其进行序列化并且没有成功。 VS 一直认为它在 Visible 上有默认值
-
当然不能。我之前的问题只是想知道如何进行。很快,我们需要以某种方式从外部为
Border类提供默认值,没有别的办法。
标签: c# winforms visual-studio serialization windows-forms-designer