由于我已经开始学习C#,我已经看到了几种处理事件的方法。假设我有一个像这样的XAML按钮:
<Button x:Name="button" Content="Click me!"/>
有了这个按钮,我可以通过多种方式连接点击事件:
修改按钮的Click
属性以指向后面代码中的方法,如:
<Button x:Name="button" Content="Click me!" Click="button_Click"/>
然后将button_Click
方法添加到代码中:
private void button_Click(object sender, RoutedEventArgs e)
{
button.Content = "Ow >_<";
}
通过后面代码中的委托处理事件:
button.Click += delegate
{
button.Content = "Ow >_<";
};
通过后面代码中的lambda表达式处理事件:
button.Click += (object sender, RoutedEventArgs e) =>
{
button.Content = "Ow >_<";
};
鉴于这三种方法,我有几个问题:
答案 0 :(得分:2)
答案 1 :(得分:2)
这些方法之间的根本区别是什么?
没有根本区别。它们只是向事件注册处理程序的不同方式。
处理事件的另一种方式(以及更易于维护的应用程序的推荐方法)实际上是将视图(GUI)与视图模型(视图背后的逻辑)分开。这称为MVVM模式。 WPF支持数据绑定,这允许您在视图模型类中定义命令,然后您可以将XAML中的按钮附加到此类命令。
请查看this stackoverflow question以获取有关此内容的更多信息。
答案 2 :(得分:1)
从内存泄漏的角度来看,除非您绝对确定这些是一次性事件订阅,否则您将尝试避免方法#2和#3。原因是,您如何取消订阅?
当您编写一个简单的示例代码时,挑战并不容易看到。但是,如果是一个视图模型是一次又一次地动态创建的,基于用户双击列表(或类似的东西),并且这个VM正在将处理程序挂钩到另一个类&#39;事件?当这些VM中的一个或多个超出范围时,您将如何清除事件订阅?典型的订阅删除方式如下:
otherClass.SomeEvent -= myHandler;
但如果您使用匿名代表或lambda,您会怎么做?如果你以某种方式引入2个或更多带有.NET决定相同签名的lambda,这就变成了一场噩梦。哎呀。