Как запустить событие с такими аксессуарами:
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
Если бы это было нормальное событие, я бы запустил его:
CanExecuteChanged(sender, EventArgs..).
Но здесь не работает - могу только
CanExecuteChanged +=..
чтобы прикрепить метод, выполните событие, но я не могу его запустить.
Также приветствуется некоторая документация по этому вопросу. Спасибо.
РЕДАКТИРОВАТЬ Событие из класса, реализующего ICommand в WPF. показать больше нечего :). И нет - CommandManager.RequerySuggested (this, EventArgs.Empty); не работает.
РЕДАКТИРОВАТЬ2 Не уверен, что сказать - пример Джона должен был работать, даже если метод добавления вызывается правильно - когда я пытаюсь вызвать событие - он равен нулю: |. Я, наверное, буду отбрасывать события с помощью аксессуаров.





Вы должны напрямую вызывать базовые события. В вашем случае это выглядит так:
<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!");
}
}
Черт ... Я сам нашел эту статью, но в ней не было достаточно фрагментов кода :), поэтому я продолжаю. Кроме того, Джон объяснил примерно то же самое, только короче :). Но спасибо, что зашли более подробно.
Это событие просто подписка и отказ от подписки на другое событие. Если вы хотите, чтобы ваши подписчики (и Только ваши подписчики - а не отдельные для другого события) вызывались, вам нужно держать своих подписчиков отдельно. Например, вы можете изменить код примерно так:
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();
}
}
}
Здесь показаны два типа событий.
нашел проблему. Если вы обертываете делегата, вы должны вызвать делегата напрямую, а не событие, как обычно. См. Сообщение ниже.