派生类强制将属性写入initializecomponent

本文关键字:initializecomponent 属性 派生 | 更新日期: 2023-09-27 18:30:04

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

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

我担心定制的codedomserializer将成为解决方案,但我正在努力避免这种情况。我希望"基地"有尽可能少的代码。

我如何让我的属性(在代码中设置在我可以从哪里获得它的地方)通过从设计器编辑它而被阻塞到初始化组件中?

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";
      }
   }

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

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

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

基本上,当我在设计器中打开派生并尝试使用自定义编辑器时,它会得到"在基类中设置"作为TestProperty的值。我需要在initializecomponent中设置TestProperty,以便我的编辑器控件能够看到值。

派生类强制将属性写入initializecomponent

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

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

相关文章:
  • 没有找到相关文章