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

时间:2009-05-31 23:27:32

标签: c# properties user-controls

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

4 个答案:

答案 0 :(得分:6)

您是否可以修改属性定义?一种方法是,向属性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();
        }
    }
}

答案 1 :(得分:2)

迈克尔提供了一个很好的答案,它将在运行时解决您的问题。但是,在设计时,如果您需要能够多次更改该值(这是设计时间,概率可能很高),那么您需要将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()并在第二组中获得一个拙劣的设计师。

答案 2 :(得分:1)

您可以在属性设置器中抛出异常吗?

public int SomeProperty {

   set {

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

   }

}

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

答案 3 :(得分:1)

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

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

private int _foo;

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

        _foo = value;
    }
}