如何启动具有以下访问权限的事件:
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
如果这是正常事件,我会通过以下方式启动它:
CanExecuteChanged(sender, EventArgs..).
但在这里它不起作用 - 我只能做
CanExecuteChanged +=..
附加方法执行事件 - 但我无法启动它。
此外,还有一些关于这个主题的文件。 感谢。
修改 该事件来自在WPF中实现ICommand的类。没有什么可以显示:)。 并且没有 - CommandManager.RequerySuggested(this,EventArgs.Empty);不起作用。
EDIT2 不知道该说些什么 - 即使正确调用了add方法,Jon的例子也应该有效 - 当我尝试调用事件时 - 它是null:|。我可能会 使用访问器删除事件。
答案 0 :(得分:4)
我认为你有与代表混淆的事件。只有暴露事件的类才能引发它......其他人只能订阅 - 取消订阅它。如果您在声明事件的类中调用事件,它应该像常规委托一样工作。
我在Events vs Delegates找到的最佳网页。阅读..
你能发布一个更大的片段......似乎有些不对......
我想我终于看到了你的问题以及如何解决它。 简答:如果您编写自己的访问者,它不知道要调用的委托的名称。如果你没有..编译器添加已知名称的私有委托,因此可以调用它
此代码段显示了我的意思。这MSDN article showed me the light。很棒的问题伙计......我失去了30分钟。 Upvoted:)
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!");
}
}
答案 1 :(得分:3)
该事件只是订阅和取消订阅另一个事件。如果您希望调用订阅者(并且仅您的订阅者 - 而不是与其他活动分开的订阅者),则需要单独保留订阅者。例如,您可以将代码更改为:
private EventHandler canExecuteChanged;
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
canExecuteChanged += value;
}
remove
{
CommandManager.RequerySuggested -= value;
canExecuteChanged -= value;
}
}
答案 2 :(得分:1)
好的,我发现如果我想触发那个事件你必须这样做:
CommandManager.InvalidateRequerySuggested();.
答案 3 :(得分:0)
您必须直接调用基础事件。在您的情况下,看起来好像是:
<blockquote>CommandManager.RequerySuggested(sender, EventArgs.…)</blockquote>
/编辑:好的,我没注意到CommandManager
是一个框架类。在这种情况下,你显然不想做我提出的建议。 Jon的解决方案就是要点:你必须跟踪自己的事件并调用它(例如作为代表)。与Jon的例子一致,调用看起来像这样:
canExecuteChanged(sender, EventArgs.Empty);
答案 4 :(得分:0)
同样来自C#规范,http://www.microsoft.com/en-us/download/details.aspx?id=7029,在“10.8.1类字段事件”下,它说“当编译类似字段的事件时,编译器会自动创建存储来保存代理”,
规格也说:
因此,表单的实例事件声明:
class X
{
public event D Ev;
}
可以编译为等同于:
的东西
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();
}
}
}
这里展示了两种事件