繁体   English   中英

C#在运行时停止属性更改

[英]C# stop property change at runtime

我一直在尝试使用设计器中设置的一些自定义属性来构建用户控件。 但是,控件涉及一些不应在运行时调整的互操作代码和设置。 有没有办法在设计师代码最初设置后停止更改的值?

你能修改属性定义吗? 一种方法是,向属性setter添加一个sentinel,并且只允许一个set操作(通常由InitializeComponent()完成):

private int _myProperty;
private bool _isMyPropertySet = false;
public int MyProperty
{
    set
    {
        if (!_isMyPropertySet)
        {
            _isMyPropertySet = true;
            _myProperty = value;
        }
        else
        {
            throw new NotSupportedException();
        }
    }
}

迈克尔提供了一个很好的答案,它将在运行时解决您的问题。 但是,在设计时,如果您需要能够多次更改该值(这是设计时间,概率可能很高),那么您需要将DesignMode检查与Michaels示例结合使用:

private int _myProperty;
private bool _isMyPropertySet = false;
public int MyProperty
{
    set
    {
        if (this.DesignMode || !_isMyPropertySet)
        {
                _isMyPropertySet = true;
                _myProperty = value;
        }
        else
        {
                throw new NotSupportedException();
        }
    }
}

现在,您可以在设计过程中将此值编辑到您的内容中,而不会遇到NotSupportedException()并在第二组上获得一个拙劣的设计器。

你可以在属性setter中抛出一个异常?

public int SomeProperty {

   set {

      if(designerComplete) {
          throw new IllegalOperationException();
      }

   }

}

将designerComplete设置为类变量 - 在构造函数中调用InitializeComponent方法后将其设置为true。

WinForms体系结构提供了一种内置方法来测试代码当前是否在设计模式下执行 - Component.DesignMode属性。

所以你可能想要一个像这样的实现:

private int _foo;

public int Foo
{
    get { return _foo; }
    set
    {
        if (this.DesignMode)
            throw new InvalidOperationException();

        _foo = value;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM