WPF 事件,声明式还是处理程序?

3

我是WPF的新手,正在寻找事件处理的最佳实践。例如,我有一个包含3个复选框的网格控件,我想在所有3个复选框的“选中”和“取消选中”事件上调用相同的过程。我可以在网格控件上声明式地完成它:

<Grid Name="grdChecks" CheckBox.Checked="EvaluateMe" CheckBox.Unchecked="EvaluateMe" >

或者我可以在页面加载时完成它。
    Dim ck As System.Windows.Controls.CheckBox
    For Each child In Me.grdChecks.Children
        If child.GetType.Name = "CheckBox" Then
            ck = DirectCast(child, System.Windows.Controls.CheckBox)
            AddHandler ck.Checked, AddressOf Me.EvaluateMe
            AddHandler ck.Unchecked, AddressOf Me.EvaluateMe
        End If
    Next

两种方法中哪一种被认为是最佳实践,还是有其他方面需要考虑?
3个回答

0
通常情况下,我更喜欢将事件处理程序声明放在XAML中,因为这样可以使其更易于跟踪(无需在页面加载时检查所有子项)。此外,如果您向窗口/控件等添加了一个不应该被订阅的复选框,则您的Page_Load代码会引起问题。
话虽如此,许多人不认为这两种方法是“最佳实践”,因为在WPF中通常不鼓励使用代码后台。将复选框移动到ViewModel中使用绑定属性通常被认为是最佳实践。

如果你是WPF的新手,我建议你看一下http://reedcopsey.com/series/windows-forms-to-mvvm/。虽然代码是用C#写的,但概念是相同的,这是一个从WinForms和其他基于事件的思考方式过渡的简单方法。 - Reed Copsey
谢谢,我对C#很熟悉,稍后会查看链接并提供反馈。 - oldDavid

0

如果您的事件操作UI / UI的功能,那么在XAML中声明事件处理程序就可以了。

如果您的事件处理程序应该管理数据逻辑和其他与UI无关的内容,并且您正在使用MVVM结构,则应使用命令将事件绑定到视图模型中的命令检查EventToCommand

我不认为在XAML的代码后台声明事件处理程序是一种好的做法,因为它降低了XAML应该提供的可读性。


谢谢!我看到了一些关于ViewModels的参考资料,但还没有深入研究。我会去了解一下的。 - oldDavid
感谢所有回复的人。关于“直接”WPF vs MVVM,我认为这是选择正确工具的问题。如果你的目标是多个平台,或者你正在编写其他人将用于开发应用程序的框架,我可以看到MVVM很有用。 如果你仅针对一个平台进行开发(在我的情况下我从一个Windows应用开始),是否值得投资时间来编写所有的基础设施呢? 现在我采取的方法是处理UI事件,例如在代码后端启用/禁用控件,但将业务逻辑交给另一个类。 - oldDavid

0

感谢所有回复的人。关于“直接”WPF与MVVM,我认为这是选择正确工具的问题。如果您针对多个平台或编写其他人将用于开发应用程序的框架,则可以看到MVVM很有用。如果您只针对一个平台进行定位-在我的情况下,我从Windows应用程序开始-是否值得投资时间编写所有管道?目前,我采取的方法是在代码后面处理UI事件,例如启用/禁用控件,但将业务逻辑移交给不同的类。


我写了我的第一个WPF应用程序,大部分事情都在代码后台完成。那是一个巨大的错误。我们现在使用MVVM(使用MVVM框架使事情更容易),现在我们已经做了一段时间,甚至不需要考虑它。像大多数事情一样,开始很困难,但最终你会达到巡航速度。 - MetalMikester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接