2012-06-22 8 views
8

Me preguntaba cómo decidir cuándo usar converters y cuándo usar triggers. Prefiero utilizar un disparador para las operaciones en la GUI (como mostrar/ocultar controles, cambiar su apariencia, etc.).¿Debo usar convertidor WPF o disparador?

Hace algún tiempo, he usado un BooleanToVisibilityConverter para este propósito, pero ahora, sólo que no lo necesitan, yo todo lo relacionado con el uso de un visibility desencadenantes e incluso empecé a pensar "cuál era el propósito de crear a BooleanToVisibilityConverter por el equipo de MS? ". Generalmente, cuando es posible, trato de usar una forma declarativa para escribir el código, en este ejemplo, XAML.

¿Cuál es su opinión al respecto?

+0

disparador se utilizan para la verificación de valor único donde el convertidor utilizado para el tipo complejo y diferente de la conversión de valores. – JSJ

+0

pregunta similares insinuando hacia costo de rendimiento de los convertidores - http://stackoverflow.com/questions/5508159/datatrigger-vs-databinding-with-converter-performance-wise – akjoshi

Respuesta

13

Estoy de acuerdo con usted, también trato de usar el código declarativo en XAML y prefiero Triggers en lugar de Converters.

En la mayoría de los escenarios, los desencadenantes pueden realizar el mismo trabajo que cualquier convertidor, pero Converters puede tener una lógica personalizada/comercial como mencionó pchajer.

Una limitación de Triggers es que Setter en su DataTriggers sólo puede cambiar las propiedades de los elementos de la interfaz; por lo tanto, no puede actualizar su propiedad ViewModels con desencadenantes, que es donde Converters gana, recuerde el método ConvertBack.

Así, puede enlazar su propiedad VM con unos controles utilizando VisibilityBooleanToVisibilityConverter e incluso si sus controles visibility se cambia por otros medios su propiedad VM se actualizará; generalmente no es necesario, por eso BooleanToVisibilityConverter se reemplaza por desencadenantes.

Así que en breve -

Triggers sólo se puede realizar OneWay operaciones mientras que Converters puede realizar TwoWay operaciones

+1

es divertido * * cómo esta respuesta es casi exactamente el mismo que [ este otro] (http://stackoverflow.com/a/19474466/540776) – superjos

+0

@superjos Yo diría 'cómo la otra respuesta es casi exactamente la misma que esta': D Gracias por señalar eso, me hizo sonreír :) – akjoshi

+1

Sí, para permanecer en el tema, sólo tienes que copiar-pegar mi comentario aquí y allí :) – superjos

1

Puede conseguir la funcionalidad, ya sea por gatillo o convertidor pero desde mi opción a continuación posibilidad se puede considerar al tomar la decisión

  1. Si está utilizando el enfoque TDD para el desarrollo y luego ir por los convertidores como se puede escribir casos de prueba .
  2. Si hay alguna lógica de negocios mejor para el código correcto en el convertidor y algunas cosas que no pueden lograrse mediante el activador.
1

Además de lo que se ha dicho más arriba sólo puedo añadir:

  • Los desencadenantes a veces requieren duplicar cosas, p. Cuando tiene más de una propiedad para desencadenantes, necesita especificar cada una de las combinaciones
  • Algunas veces necesitará un código para convertir correctamente de tipo A a B, luego debe usar conversores. Los desencadenadores son buenos si el valor/propiedad ya está expuesto desde la máquina virtual de manera que pueda usarlo para desencadenantes.
2

En mi opinión, usted está mirando de abajo hacia arriba y solo necesita mirar de arriba hacia abajo.

disparadores -Cuando una condición especificada se cumple que "dispara" una ejecución

convertidores -Convertir entre dos tipos incompatibles.

¿Por qué necesitamos un tipo booleano cuando podemos hacer la misma funcionalidad con números enteros?

0

Usted debe hacer siempre las operaciones relacionadas con negocios en los objetos de modelo de dominio, o al menos en un objeto de modelo de vista. Hacer que algunos negocios funcionen en el convertidor no es una buena opción porque los convertidores están diseñados para convertir un valor de un tipo a otro.

+0

Dida ¿ves mi pregunta? Escribí explícitamente: "para operaciones en GUI (como mostrar/ocultar controles, cambiar su apariencia, etc.)". Sé que las opciones relacionadas con el negocio deben controlarse en el objeto DomainModel. –