我应该使用WPF转换器还是触发器?

时间:2012-06-22 08:01:03

标签: .net wpf xaml triggers converter

我想知道您如何决定何时使用converters以及何时使用triggers。 我更喜欢在GUI上使用触发器来操作(比如显示/隐藏控件,改变它们的外观等)。

前段时间我使用了BooleanToVisibilityConverter用于此目的,但现在,我只是不需要它,我使用触发器连接到visibility所有事情,我甚至开始思考“ MS团队创建BooleanToVisibilityConverter的目的是什么?“。通常,当我有可能尝试使用声明方式编写代码时 - 在本例中 - XAML。

您对此有何看法?

5 个答案:

答案 0 :(得分:18)

我同意你的观点,我也尝试在XAML中使用声明性代码,而不是Triggers而不是Converters

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

Triggers的一个限制是DataTriggers中的 Setters只能更改UI元素的属性;所以,你无法使用触发器更新你的ViewModels属性,那就是Converters获胜的地方,请记住ConvertBack方法。

因此,您可以使用Visibility将VM属性与控件BooleanToVisibilityConverter绑定,即使您的控件visibility被其他方式更改,您的VM属性也会更新; 通常情况下,并不要求BooleanToVisibilityConverter被触发器取代的原因。

所以简而言之 -

  

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

答案 1 :(得分:2)

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

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

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

为什么我们可以在使用整数时执行相同的功能时需要布尔数据类型?

答案 2 :(得分:1)

您可以通过触发器或转换器实现该功能,但是从我的选项中可以在做出决定时考虑可能性

  1. 如果您正在使用TDD方法进行开发,那么请选择转换器,因为您可以编写测试用例。
  2. 如果在转换器中有正确的代码存在任何业务逻辑,而且无法通过触发器实现某些代码。

答案 3 :(得分:1)

除了上面所说的,我只能添加:

  • 触发器有时需要复制内容,例如如果您有多个触发器属性,则需要指定每个组合
  • 有时您需要代码才能正确地从A类转换为B,然后您必须使用转换器。如果值/属性已经从VM中公开,触发器很好,您可以将它用于触发器。

答案 4 :(得分:0)

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