Заставить дизайнера Visual Studio игнорировать публичное свойство

У меня есть UserControl с открытым свойством, используя следующие атрибуты:

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

Я попытался удалить форму владельца, заново создать новую форму в Visual Studio 2010 и добавить этот пользовательский элемент управления в форму. Он продолжает добавлять строку, подобную следующей в файле Designer:

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

Это приводит к сбою моего приложения, потому что это свойство не предназначено для создания при сериализации.

4 ответа

Решение

Я не смог найти реальное решение, но вместо этого...

Мне нужно было зайти в файл Form.resx и найти пару ключей данных / значений, которые они десериализовали, в мою публичную собственность. Я вручную удалил содержимое пары XML, а затем смог запустить приложение.

Это позволило моему приложению создавать и запускать без ошибок. Все остальное, что я пробовал (включая удаление формы контейнера для моего UserControl и повторное ее создание повторно), не сработало.

Создание свойства только для чтения во время разработки предотвратит его сериализацию в файл resx. Как ни странно, если MyType является коллекцией, конструктор игнорирует только чтение, и вы все равно можете установить свойство во время разработки, даже если это свойство не записано в resx, поэтому лучше сделать это свойство не доступным для просмотра.

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

Использование [DesignerSerializationVisibilityAttribute ( Visibility = Hidden )]

Статья MSDN

Попробуйте использовать личное поле с методами доступа свойства вместе с атрибутом [field: NonSerialized]:

[field: NonSerialized]
private MyType _MyProperty;

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyType MyProperty
{
    get
    {
        return _MyProperty;
    }
    set
    {
        _MyProperty = value;
    }
}
Другие вопросы по тегам