1

我有一个基类和一个派生类(如下所述),以及一个属性“TestProperty”。我的目标是让我在 testproperty 中设置的值在 intializecomponent 中序列化。这非常关键,因为稍后,我需要基类在设计时访问此属性的新值,除非该值在 intializecomponent 中设置,否则我将无法访问此新值,“默认值”,如果你好的话(但是,我认为默认值属性在这种情况下不相关)。

在下面的情况下,让我的属性序列化的唯一方法是,如果我在设计器中打开“派生”并手动将属性设置为新值。

我担心自定义 codedomserializer 将成为解决方案,但我非常努力避免这种情况。我希望“基础”的代码尽可能少。

我怎样才能让我的属性(在代码中设置我可以从中获取它的任何地方)通过从设计器中编辑它来卡在 initializecomponent 中?

public partial class Base : Form
   {
      public Base()
      {
         InitializeComponent();
         TestProperty = "set in the base class";
      }
      [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
      public string TestProperty
      {
         get;
         set;
      }
   }

和一个简单的派生类

public partial class Derived : Base
   {
      public Derived()
      {
         InitializeComponent();
         this.TestProperty = "i want to be packed into initializecomponent somehow";
      }
   }

关于我为什么要尝试做我正在做的事情的更多信息。

我的问题是,当我在设计器中打开“派生”时,我有一个自定义编辑器控件 bieng 用于编辑某些属性,称为“可编辑属性”。在这种情况下,EditableProperty 需要访问 TestProperty。在运行时,这没问题,我可以完全访问 Derived 作为一种类型,这没问题。

问题是我正在使用的 EditorControl 位于不同的程序集中,并且它(无论出于何种原因,我认为这是因为它在与派生不同的程序集中)不会加载我在派生的构造函数中设置的新值.

基本上,当我在设计器中打开派生并尝试使用自定义编辑器时,它会“在基类中设置”作为 TestProperty 的值。我需要在 initializecomponent 中设置 TestProperty 才能让我的 editorcontrol 看到该值。

4

1 回答 1

1

表单设计器没有创建 Derived 的实例;它正在创建 Base 的一个实例,然后从 Derived 调用 InitializeComponent 方法。这就是为什么您设置的属性的新值没有被设计器拾取。

您所要做的就是在设计器中为 Derived 设置属性的值,而不是在构造函数中设置它。这将在 InitializeComponent 中保留该属性的新值,并使其在设计时可见。

于 2012-04-04T16:04:36.607 回答