Имя RoutedEvent уже используется

В WPF я создал 3 пользовательских элемента управления "Конфигурация пользователя", "Конфигурация системы" и "Конфигурация учетной записи". Все эти элементы управления имеют кнопки "Сохранить" и "Отмена". При нажатии этих кнопок они вызывают маршрутизируемое событие, объявленное и определенное в соответствующих классах. При нажатии кнопки "Сохранить" вызывается событие "ConfigurationSaved", а при отмене - событие "ConfigurationCancelled".

При возникновении этих событий контейнер, в котором размещается пользовательский элемент управления, позаботится о сохранении конфигурации.

Фрагмент кода для определения всех маршрутизируемых событий класса выглядит следующим образом:

AccountConfigurationView:

public partial class AccountConfigurationView : UserControl
{
    static AccountConfigurationView()
    {
        ConfigurationSavedEvent = EventManager.RegisterRoutedEvent("ConfigurationSaved",
        RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AccountConfigurationView));

        ConfigurationClosedEvent = EventManager.RegisterRoutedEvent("ConfigurationClosed",
        RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AccountConfigurationView));
    }

    #region ROUTED_EVENTS_RELATED
    public static readonly RoutedEvent ConfigurationSavedEvent;
    public static readonly RoutedEvent ConfigurationClosedEvent;

    public event RoutedEventHandler ConfigurationSaved
    {
        add { AddHandler(ConfigurationSavedEvent, value); }
        remove { RemoveHandler(ConfigurationSavedEvent, value); }
    }

    public event RoutedEventHandler ConfigurationClosed
    {
        add { AddHandler(ConfigurationClosedEvent, value); }
        remove { RemoveHandler(ConfigurationClosedEvent, value); }
    }
    #endregion
}

SystemConfigurationView:

public partial class SystemConfigurationView : UserControl
{
    static SystemConfigurationView()
    {
        ConfigurationSavedEvent = EventManager.RegisterRoutedEvent("ConfigurationSaved",
        RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SystemConfigurationView));

        ConfigurationClosedEvent = EventManager.RegisterRoutedEvent("ConfigurationClosed",
        RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SystemConfigurationView));
    }

    #region ROUTED_EVENTS_RELATED
    public static readonly RoutedEvent ConfigurationSavedEvent;
    public static readonly RoutedEvent ConfigurationClosedEvent;

    public event RoutedEventHandler ConfigurationSaved
    {
        add { AddHandler(ConfigurationSavedEvent, value); }
        remove { RemoveHandler(ConfigurationSavedEvent, value); }
    }

    public event RoutedEventHandler ConfigurationClosed
    {
        add { AddHandler(ConfigurationClosedEvent, value); }
        remove { RemoveHandler(ConfigurationClosedEvent, value); }
    }
    #endregion
}

UserConfigurationView:

public partial class UserConfigurationView : UserControl
{
    static UserConfigurationView()
    {
        ConfigurationSavedEvent = EventManager.RegisterRoutedEvent("ConfigurationSaved",
        RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserConfigurationView));

        ConfigurationClosedEvent = EventManager.RegisterRoutedEvent("ConfigurationClosed",
        RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserConfigurationView));
    }

    #region ROUTED_EVENTS_RELATED
    public static readonly RoutedEvent ConfigurationSavedEvent;
    public static readonly RoutedEvent ConfigurationClosedEvent;

    public event RoutedEventHandler ConfigurationSaved
    {
        add { AddHandler(ConfigurationSavedEvent, value); }
        remove { RemoveHandler(ConfigurationSavedEvent, value); }
    }

    public event RoutedEventHandler ConfigurationClosed
    {
        add { AddHandler(ConfigurationClosedEvent, value); }
        remove { RemoveHandler(ConfigurationClosedEvent, value); }
    }
    #endregion
}

Когда я использую эти классы, я получаю TypeInitializationException с сообщением:

Имя Routed Event "ConfigurationSaved" для OwnerType "baskcode.Admin.Controls.AccountConfigurationView" уже используется.

Такое же исключение выдается, если я пытаюсь загрузить любой из других элементов управления. Я не могу исправить проблему. Пожалуйста, помогите мне в этом отношении.

Я использую .Net версии 4

Благодарю.

2 ответа

Решение

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

Попробуйте это (для одного RoutedEvent):

RoutedEvent[] x = EventManager.GetRoutedEventsForOwner(typeof(UserConfigurationView));

if(x == null) {
    ConfigurationSavedEvent = EventManager.RegisterRoutedEvent(
        "ConfigurationSaved",
        RoutingStrategy.Bubble,
        typeof(RoutedEventHandler),
        typeof(UserConfigurationView)
    );
}

И это (для нескольких экземпляров): в вашем случае

using System.Linq;

...

RoutedEvent[] x = EventManager.GetRoutedEvents();

if(!x.Contains(ConfigurationSaved)) {
    ConfigurationSavedEvent = EventManager.RegisterRoutedEvent(
        "ConfigurationSaved",
        RoutingStrategy.Bubble,
        typeof(RoutedEventHandler), 
        typeof(UserConfigurationView)
    );
}

Проверьте аргументы EventManager.RegisterRoutedEvent. Если вы скопировали и вставили его из другого файла, легко забыть изменить тип владельца. Например:

public class UserControlA
{
  public static readonly RoutedEvent ClickEvent =
    EventManager.RegisterRoutedEvent(
      "Click",
      RoutingStrategy.Bubble,
      typeof(RoutedEventHandler),
      typeof(UserControlA));
}

Но затем вы копируете и вставляете это в другой файл. Обратите внимание на ошибочный typeof(UserControlA) ниже, который должен быть typeof (UserControlB).

public class UserControlB
{
  public static readonly RoutedEvent ClickEvent =
    EventManager.RegisterRoutedEvent(
      "Click",
      RoutingStrategy.Bubble,
      typeof(RoutedEventHandler),
      typeof(UserControlA));
}
Другие вопросы по тегам