Making the Visual Studio designer ignore a public property

10.6k views Asked by At

I have a UserControl with a public property using the following attributes:

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

I have tried deleting the owner form, re-creating a fresh form in Visual Studio 2010, and adding this UserControl to the form. It keeps adding a line like the following in the Designer file:

this.vMyUserControl.MyProperty = ((MyNamespace.MyClass)(resources.GetObject("vMyUserControl.MyProperty")));

This crashes my application because this property is not designed to be created by serialization.

4

There are 4 answers

0
Trevor Elliott On BEST ANSWER

I failed to find a real solution, but a workaround instead...

I had to go into the Form.resx file and locate the data/value key pair that it was deserializing into my public property. I manually deleted the XML pair contents and then I was able to run the application.

This allowed my application to build and run without errors. Everything else I tried (including deleting the container form for my UserControl and re-creating it repeatedly) did not work.

0
Nour On

Use [DesignerSerializationVisibilityAttribute ( Visibility = Hidden )]

MSDN Article

0
Mejwell On

Try using a private field with the property's accessor methods along with the [field: NonSerialized] attribute:

[field: NonSerialized]
private MyType _MyProperty;

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyType MyProperty
{
    get
    {
        return _MyProperty;
    }
    set
    {
        _MyProperty = value;
    }
}
3
David Ewen On

Making the property read only at design time will prevent it being serialized into the resx file. Strangely if MyType happens to be a collection the read only is ignored by the designer and you can still set the property at design time even though the property isn't written out into the resx so it's best to make the property not browsable too.

[ReadOnly(true)]
[Browsable(false)]
public MyType MyProperty
{
    get { return _MyProperty; }
    set { _MyProperty = value; }
}