0

为了尽量减少后面代码中的内容,我想将我们的一些事件逻辑转换为附加行为。我已经阅读了这篇文章,虽然我想实现类似的目标,但我不确定如果行为影响多个控件我将如何进行。

一个例子:我们的应用程序有一个侧边栏,用户可以通过一个按钮停靠在左侧或右侧。如果按钮被触发,我们的事件会触发并相应地重新排列控件。这很容易用后面的纯代码来完成,因为我可以访问视图中存在的所有控件。

现在,我将向该按钮添加一个附加行为来处理这种情况,但我需要访问其他控件来更改它们的位置。这是否可能与附加行为(如果是,如何?),还是有另一种可能性或模式来做到这一点?

4

2 回答 2

1

需要明确的是,MVVM 方法中没有任何内容表明不能使用后面的代码。MVVM 中最重要的原则是提供关注点分离,使我们能够独立于视图测试视图模型。

但是,您的SideBar控件听起来像是提供 UI 功能而不是数据操作功能,在这种情况下,视图模型不需要了解它的任何信息。因此,任何可能在其代码后面的代码都不需要与视图模型测试一起进行测试,所以它在那里是完全可以的。

我通常遵循这个简单的规则:

如果一个特定的视图只是一个在其他视图中使用的控件并且只是提供一些小的 UI 功能,那么我将功能放入其代码而不是视图模型中。

一个示例可能是FeedbackControl只为用户反馈设置动画的控件,或者为方便起见仅包含一些其他标准控件的控件。

于 2014-07-28T12:34:16.527 回答
1

背后的代码并不像视图模型(或数据上下文)和视图之间的耦合那么糟糕,而且您似乎完全拥有这一点(在后面的代码中实现)。您应该尝试将视图模型(或数据上下文)从视图中分离出来,为此您需要在描述布局的视图模型中引入属性(例如DockingPosition)。然后视图应该对这些属性使用数据绑定并相应地修改布局。您会发现触发器和可视状态管理器在这里可能会有所帮助。(作为额外的好处,您将能够为布局更改设置动画以获得更好的用户体验。)

如果你成功地做到了这一点,你会发现你可以摆脱很多背后的代码(背后的糟糕代码引入了很多耦合)。如果此时,您仍然有一些代码,例如将文本框更改为纯数字文本框的代码,您可以将其重构为附加行为,使行为可重用并能够在 XAML 中以声明方式使用。

行为是附加到一个单一的DependencyObject,你很少应该尝试使用一个行为来连接多个控件。

于 2014-07-28T09:52:01.927 回答