Запустить событие с аксессуарами

Как запустить событие с такими аксессуарами:

public event EventHandler CanExecuteChanged
    {
      add
      {
        CommandManager.RequerySuggested += value;
      }
      remove
      {
        CommandManager.RequerySuggested -= value;
      }
    }

Если бы это было нормальное событие, я бы запустил его:

CanExecuteChanged(sender, EventArgs..). 

Но здесь не работает - могу только

CanExecuteChanged +=..

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

Также приветствуется некоторая документация по этому вопросу. Спасибо.

РЕДАКТИРОВАТЬ Событие из класса, реализующего ICommand в WPF. показать больше нечего :). И нет - CommandManager.RequerySuggested (this, EventArgs.Empty); не работает.

РЕДАКТИРОВАТЬ2 Не уверен, что сказать - пример Джона должен был работать, даже если метод добавления вызывается правильно - когда я пытаюсь вызвать событие - он равен нулю: |. Я, наверное, буду отбрасывать события с помощью аксессуаров.

нашел проблему. Если вы обертываете делегата, вы должны вызвать делегата напрямую, а не событие, как обычно. См. Сообщение ниже.

Gishu 16.10.2008 16:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
1 273
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы должны напрямую вызывать базовые события. В вашем случае это выглядит так:

<blockquote>CommandManager.RequerySuggested(sender, EventArgs.…)</blockquote>

/ EDIT: Хорошо, я не заметил, что CommandManager - это класс фреймворка. В этом случае вы, очевидно, не хотите делать то, что я предлагал. Решение Джона по существу: вы должны отслеживать собственное событие и вызывать его (например, в качестве делегата). В соответствии с примером Джона вызов будет выглядеть так:

canExecuteChanged(sender, EventArgs.Empty);

Я думаю, вы путаете события с делегатами. Только класс, выставляющий событие, может вызвать его ... Остальные могут только подписаться-отписаться от него. Если вы вызываете событие из класса, объявляющего событие, оно должно работать как обычный делегат.

Лучшая страница, которую я смог найти на События против делегатов. Прочитать..

Вы можете опубликовать фрагмент побольше ... Кажется, что-то не так ...

Убийственное обновление

Думаю, я наконец-то вижу вашу проблему и способы ее решения. Краткий ответ: Он не знает имени вызываемого делегата, если вы пишете свои собственные средства доступа. Если вы этого не сделаете ... компилятор добавляет частный делегат с известным именем и, следовательно, может вызвать его

Этот фрагмент кода показывает, что я имею в виду. Это Статья MSDN показала мне свет. Отличный вопрос, чувак .. Я потерял 30 минут. Проголосовали :)

public class Hash1 
    {

        private EventHandler myHomeMadeDelegate;
        public event EventHandler FancyEvent
        {
            add
            {
                //myDelegate += value;
                myHomeMadeDelegate = (EventHandler)Delegate.Combine(myHomeMadeDelegate, value);
            }
            remove
            {
                //myDelegate -= value;
                myHomeMadeDelegate = (EventHandler)Delegate.Remove(myHomeMadeDelegate, value);
            }
        }
        public event EventHandler PlainEvent;


        public Hash1()
        {
            FancyEvent += new EventHandler(On_Hash1_FancyEvent);
            PlainEvent += new EventHandler(On_Hash1_PlainEvent);

            // FancyEvent(this, EventArgs.Empty);  //won't work:What is the backing delegate called? I don't know
            myHomeMadeDelegate(this, EventArgs.Empty); // Aha!
            PlainEvent(this, EventArgs.Empty);
        }

        void On_Hash1_PlainEvent(object sender, EventArgs e)
        {
            Console.WriteLine("Bang Bang!");
        }

        void On_Hash1_FancyEvent(object sender, EventArgs e)
        {
            Console.WriteLine("Bang!");
        }
}

Черт ... Я сам нашел эту статью, но в ней не было достаточно фрагментов кода :), поэтому я продолжаю. Кроме того, Джон объяснил примерно то же самое, только короче :). Но спасибо, что зашли более подробно.

sirrocco 16.10.2008 16:37
Ответ принят как подходящий

Это событие просто подписка и отказ от подписки на другое событие. Если вы хотите, чтобы ваши подписчики (и Только ваши подписчики - а не отдельные для другого события) вызывались, вам нужно держать своих подписчиков отдельно. Например, вы можете изменить код примерно так:

private EventHandler canExecuteChanged;

public event EventHandler CanExecuteChanged
{
    add
    {
        CommandManager.RequerySuggested += value;
        canExecuteChanged += value;
    }
    remove
    {
        CommandManager.RequerySuggested -= value;
        canExecuteChanged -= value;
    }
}

Хорошо, я обнаружил, что если я хочу вызвать это событие, вам нужно сделать:

CommandManager.InvalidateRequerySuggested();.

вау, просто были похожие проблемы. Ответ, который помог мне понять, чем-то похож на Гишу.

Также из спецификаций C#, http://www.microsoft.com/en-us/download/details.aspx?id=7029, в разделе «10.8.1 События, подобные полям», говорится: «При компиляции событий, подобных полям, компилятор автоматически создает хранилище для хранения делегата»,

в спецификациях также говорится:

Thus, an instance event declaration of the form:

class X
{
   public event D Ev;
}

could be compiled to something equivalent to:

class X
{
   private D __Ev;  // field to hold the delegate

   public event D Ev {
      add {
         lock(this) { __Ev = __Ev + value; }
      }

      remove {
         lock(this) { __Ev = __Ev - value; }
      }
   }
}

Если вы выполните что-то вроде приведенного ниже кода, компилятор успешно его скомпилирует:

namespace ConsoleApplication1
{    
    class Program 
    {
        public event EventHandler ss;

        Program()
        {
            if (null != ss)
            {
                ss(this, EventArgs.Empty) ;

            }
        }

        static void Main(string[] args)
        {
            new Program();
        }
    }
}

И если вы добавите аксессоры к ss выше, он НЕ будет компилироваться:

namespace ConsoleApplication1
{    
    class Program 
    {
        public event EventHandler ss
        {
            add { }
            remove { }
        }

        Program()
        {
            if (null != ss)
            {
                ss(this, EventArgs.Empty) ;

            }
        }

        static void Main(string[] args)
        {
            new Program();
        }
    }
}

Здесь показаны два типа событий.

  1. Полевые события => мы можем вызывать
  2. события с аксессуарами => мы не можем вызвать (не могу найти это в спецификациях, почему, возможно, я это пропустил) (и тестировал это только в Visual Studio 2005, и спецификации были последними, я думаю)

Другие вопросы по теме