如何使用依赖于另一个属性值的属性?

保罗·吉马良斯

有一个自定义属性取决于要在 WinForms 中正确初始化的其他系统属性的值。

让我给你举个例子。让我们创建一个WhateverButton: Button具有自定义属性的类MyExampleProperty我们使用系统控件属性this.Height,它来自控件的大小。

public 
   classWhateverButton : Button 
{ 
   // 成员private int m_myExampleProperty; 

   // 构造函数
   public 
      WhatButton () { m_myExampleProperty = 1; 
   } 
    
    // 属性
    public int MyExampleProperty 
    { 
      get => m_myExampleProperty; 
      set 
      { 
        m_myExampleProperty= value > (this.Height / 2F) ?1:值;
      } 
    } 

    // 每次Size改变时,更新属性
    protected override void OnSizeChanged(EventArgs e) 
    { 
      base.OnSizeChanged(e);

      m_myExampleProperty = m_myExampleProperty > this.Height / 2F ?1:m_myExampleProperty;

    } 

}

WhateverButton在表单中添加(大小大于默认值)。WinForms 按字母顺序生成元素(按钮、标签、文本框等),例如:

      this.buttonWhatever.Location = new System.Drawing.Point (413, 57); // L 
      this.buttonWhatever.Margin = new System.Windows.Forms.Padding (3, 4, 3, 4); // M 
      this.buttonWhatever.MyExampleProperty= 30; // M 
      ... // 其他属性
      this.buttonWhatever.Name = "myElement"; // N 
      this.buttonWhatever.Size = new System.Drawing.Size (50, 80); // S 
      this.buttonWhatever.Text = "我的元素"; // T

MyExampleProperty通过表单 UI更改属性,它似乎有效,但在保存表单(Ctrl + S)后,属性返回到 1。

Debugging可以发现每次保存 Form 时,所有元素都会按该顺序再次创建。当的时间MyExampleProperty到达时,Size尚未创建属性,该属性将采用默认HeightWidth课程,并在属性的值将是错误的。如果我只是将 重命名MyExamplePropertySize在此示例中放置在属性之后的任何其他名称,它将起作用。也许我错过了一些我不知道要搜索的东西。

扫地机

您的属性的问题在于,如果在设置属性时控件的高度不正确,则传递给 setter 的值将永远丢失。

因此,在 setter 中,您应该始终分配value给支持字​​段,并检查getter 中的高度

public int MyExampleProperty
{
  get => m_myExampleProperty > (this.Height / 2F) ? 1 : m_myExampleProperty;
  set
  {
    m_myExampleProperty = value;
  }
}

这样,您甚至不需要处理SizeChanged事件!

或者甚至更好,将其写为两个属性:

public int MyExampleProperty { get; set; }
public int MyExamplePropertyThatChangesWithSize => 
    MyExampleProperty > (this.Height / 2F) ? 1 : MyExampleProperty;

...因为您没有获得刚刚设置的值的属性是非常出乎意料的,并且可能会令人困惑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使一个Maven模块依赖于另一个?

如何在本身依赖于另一个条件的条件下使用std :: enable_if?

如何编写依赖于另一个定义文件的打字稿定义文件

Python:如何从依赖于模块的另一个文件中正确导入函数

如何测试依赖于另一个服务(又依赖于Http服务)的服务/组件?

如何过滤Many2one值依赖于另一个字段?

如何观察依赖于另一个值vue的值?

TypeScript:依赖于另一个的接口属性

类型属性依赖于另一个属性的返回类型

如何使用React钩子处理/链接依赖于另一个的同步副作用

依赖于另一个受监视属性的属性

如何使参数的默认值依赖于另一个参数(在Python中)?

如何使1 CSS值依赖于另一个?

构造对象,其属性之一依赖于另一个。在C ++中

在cmake中,如何使一个目标依赖于另一个目标?

使用条件语句为依赖于另一个文本字段的文本字段分配值

如何创建一个依赖于另一个变量的任意先前值的虚拟对象?

创建依赖于另一个属性的类属性

每个依赖于另一个单元格的值的总和

如何使用Android Webview运行依赖于另一个库/模块的javascript

如何使用@InjectMocks依赖于另一个要模拟的类?

熊猫:依赖于另一个值的列

如何使用Jenkins部署依赖于GIT上另一个项目的项目?

我可以使一个对象属性类型依赖于另一个属性类型吗?

依赖于另一个计算属性的计算属性

setState 依赖于另一个类的值

Typescript 接口 - 使一个属性的类型依赖于另一个属性的类型

创建依赖于另一个属性的类属性而不覆盖

如何使用 Kotlin/native 生成依赖于另一个的 .framework?