16

我想知道您如何决定何时使用converters和何时使用triggers. 我更喜欢在 GUI 上使用触发器进行操作(例如显示/隐藏控件、更改它们的外观等)。

前段时间我BooleanToVisibilityConverter为此目的使用了 a,但现在,我只是不需要它,我做所有与visibility使用触发器相关的事情,我什至开始思考“ MS 团队创建 a 的目的是什么?” BooleanToVisibilityConverter. 通常,如果可能,我会尝试使用声明性方式来编写代码 - 在本例中 - XAML。

你对此有何看法?

4

5 回答 5

23

我同意你的看法,我也尝试在 XAML 中使用声明性代码,并且更喜欢Triggers而不是Converters.

在大多数情况下,触发器可以执行与任何转换器相同的工作,但Converters可以具有 pcajer 提到的自定义/业务逻辑。

一个限制Triggers您的 SetterDataTriggers只能更改您的 UI 元素的属性;所以,你不能用 triggers 更新你的 ViewModels 属性,这就是Converters胜利,记住ConvertBack方法。

因此,您可以使用控件将您的 VM 属性与控件绑定VisibilityBooleanToVisibilityConverter即使您的控件visibility被其他方式更改,您的 VM 属性也会得到更新;通常不需要这就是为什么BooleanToVisibilityConverter被触发器取代的原因。

简而言之——

Triggers只能执行OneWay操作而Converters可以执行TwoWay操作

于 2012-06-22T12:30:01.803 回答
2

在我看来,你是从下往上看,你只需要自上而下看。

触发器- 当满足指定条件时,它“触发”执行

转换器- 在两种不兼容的类型之间转换。

当我们可以用整数做同样的功能时,为什么我们需要一个布尔数据类型?

于 2012-06-22T14:41:13.787 回答
1

您可以通过触发器或转换器来实现该功能,但在我做出决定时可以考虑以下可能性

  1. 如果您使用 TDD 方法进行开发,那么请使用转换器,因为您可以编写测试用例。
  2. 如果有任何业务逻辑更好地对转换器中的代码和某些无法通过触发器实现的代码进行纠正。
于 2012-06-22T08:17:21.077 回答
1

除了上面所说的,我只能补充:

  • 触发器有时需要复制一些东西,例如,当您有多个触发器属性时,您需要指定每个属性的每个组合
  • 有时您需要代码才能将类型 A 正确转换为 B,然后您必须使用转换器。如果值/属性已经以某种方式从 VM 公开,则触发器很好,您可以将其用于触发器。
于 2012-06-22T12:37:56.190 回答
0

您应该始终在 DomainModel 对象中进行与业务相关的操作,或者至少在 ViewModel 对象中进行。在转换器中进行一些业务并不是一个好的选择,因为转换器旨在将值从一种类型转换为另一种类型。

于 2013-03-22T14:28:40.997 回答