C# 多个控件受影响时的附加行为

C# 多个控件受影响时的附加行为,c#,wpf,mvvm,attachedbehaviors,C#,Wpf,Mvvm,Attachedbehaviors,为了尽量减少代码背后的内容,我希望将一些事件逻辑转换为附加行为。我读过,虽然我想实现类似的目标,但我不确定如果行为影响多个控件,我将如何继续 例如:我们的应用程序有一个侧边栏,用户可以通过按钮停靠到左侧或右侧。如果按钮被触发,我们的事件将触发并相应地重新排列控件。使用纯代码隐藏很容易做到这一点,因为我可以访问视图中的所有控件 现在,我会在按钮上添加一个附加的行为来处理这种情况,但我需要访问其他控件来更改它们的位置。附加的行为是否可能实现这一点(如果可能,如何实现?),或者是否存在另一种可能性或模

为了尽量减少代码背后的内容,我希望将一些事件逻辑转换为附加行为。我读过,虽然我想实现类似的目标,但我不确定如果行为影响多个控件,我将如何继续

例如:我们的应用程序有一个侧边栏,用户可以通过按钮停靠到左侧或右侧。如果按钮被触发,我们的事件将触发并相应地重新排列控件。使用纯代码隐藏很容易做到这一点,因为我可以访问视图中的所有控件


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

代码隐藏并不像视图模型(或数据上下文)和视图之间的耦合那么糟糕,而您似乎恰恰做到了这一点(在代码隐藏中实现)。您应该尝试将视图模型(或数据上下文)与视图断开连接,为此,您需要在视图模型中引入描述布局的属性(例如,
DockingPosition
)。然后,视图应使用数据绑定到这些属性,并相应地修改布局。您会发现触发器和可视状态管理器在这里可能会有所帮助。(另外一个好处是,您可以设置布局更改的动画,以获得更好的用户体验。)

如果您成功地做到了这一点,您将发现您可以摆脱很多代码隐藏(引入大量耦合的错误代码隐藏)。如果在这一点上,您仍然有一些代码,比如将文本框更改为纯数字文本框的代码,那么您可以将其重构为附加的行为,使该行为可重用,并且能够在XAML中声明性地使用


行为附加到单个
DependencyObject
,您很少尝试使用一个行为连接多个控件。

要清楚,MVVM方法中没有任何规定不能使用代码隐藏。MVVM中最重要的原则是提供关注点的先锋,使我们能够独立于视图测试视图模型

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

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

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

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