2010-08-16 11 views
15

yo estaba buscando en la creación de un control común que voy a ser capaz de volver a utilizar en mis páginas: una AddressControl que tiene Address1, Dirección 2, ciudad, estado, código postal, etc ...Mejores prácticas de WPF: ¿Los controles personalizados funcionan bien con el diseño de MVVM?

Originalmente acabo de crear una clase (AddressEntity) que contenía todos estos elementos e implementado INotifyPropertyChanged. Incluí esa clase como DependencyProperty en mi Code-Behind para AddressControl y la utilicé como DataContext para los enlaces a sus propiedades.

Luego, alguien dijo que mi código era feo y que debería mirar en MVVM. En cuanto a ella, supongo que:

  • AddressEntity.cs solo habrá un contenedor de datos (es decir, dirección 1, dirección 2, etc.) y miembros (es decir, Clon, ToString, etc.)
  • Necesito un poco AddressViewModel para ajustar mi AddressEntity y proporcionar los PropertyNotification Changes, Validation, etc.
  • Necesito de alguna manera tener una "Vista" para esto.

El problema es que cada ejemplo que he visto tiene un UserControl como vista y no un CustomControl. Antes de ahondar demasiado en esto ...

  • ¿Es posible usar MVVM + controles personalizados para este ejemplo?
  • ¿Es más o menos lo mismo (UserControl vs CustomControl) que la Vista, con la excepción de diferencias primarias de UserControl vs CustomControl? Básicamente, ¿mi CustomControl es solo una Vista?

Referencias: The Model-View-ViewModel (MVVM) Design Pattern for WPF

+0

Las dos respuestas a continuación parecen ser contrarios entre sí. Ahora estoy confundido ... especialmente porque la segunda respuesta parece más probable, pero la primera respuesta tiene (hasta ahora 3 votos). –

+0

Estoy de acuerdo con NVM. También he considerado personalmente que Custom Controls y MVVM no pueden funcionar bien juntos. Usted tiene CC y UC en el mismo proyecto, pero no puedo pensar en tener una VM para mi CC, ya que tiene sentido tener VM para UC. – akjoshi

+1

@akjoshi No veo por qué WPF puro y MVVM tienen algo que ver entre sí. De hecho, no importa si se trata de un control personalizado o de usuario, no es necesario usar MVVM e incluso diría que no debe usar MVVM al crear un usuario o un control personalizado. PERO usando estos controles, entonces sí, MVVM es una buena forma de usarlos. Creo que es fácil distinguir entre "Ahora hago negocios logik y uso MVVM" y "Ahora creo un control y nunca escuché sobre mvvm". Por ejemplo, construimos un control gráfico completo con conexión de nodos, etc., que son todos controles personalizados, pero el uso de este control se realiza principalmente a través de viewmodels. – dowhilefor

Respuesta

18

CustomControls no se hacen con MVVM.

Lo que quiere es una vista reutilizable (control de usuario) de sus datos y no un control (control personalizado).

UserControls y CustomControls son dos bestias completamente diferentes.

EDIT:

A pesar de qué UserControls fueron desarrollados originalmente, en MVVM normalmente se utiliza un control de usuario cuando se desea una vista reutilizable que es específicamente para el modelo/modelo de vista. Es solo XAMl sin ningún código detrás (a excepción del material InitializeComponent generado automáticamente). Por lo general se mantiene un control de usuario en el mismo proyecto que se utiliza en.

vas para un CustomControl cuando se desea una pieza genérica de la funcionalidad que requiere una visión y que tiene uso potencial incluso fuera del alcance de su actual solicitud. Aquí el control se define en realidad en un archivo de código y el aspecto (que puede ser modificado) proviene de XAML en un diccionario de recursos. Generalmente usted guardar un CustomControl en AA proyecto ControlLibrary separada y una referencia a la biblioteca en el proyecto que desea utilizarlo en.

Con el debido respeto a WallStreetProgrammer, elegir entre un control de usuario y un control personalizado basado únicamente en si o no quieres un control sin sentido es un poco ingenuo.

+0

Lamentablemente, hay un par de preocupaciones adicionales cuando se trata de Controles personalizados frente a Usuario. Por ejemplo, el manejo de ResourceDictionaries, si se hace incorrectamente, puede hacer que los controles de usuario sean bastante inútiles. Pero estoy de acuerdo, la selección del control de Usuario o Personalizado no debería hacerse solo por la falta de estilo. – dowhilefor

+0

Si los diccionarios de recursos no se manejan correctamente, incluso podría volver inútil la aplicación completa: p. Pero, ¿qué tiene eso que ver con la pregunta? – NVM

+0

Por supuesto que tiene razón, pero usar un MergedDictionary en un control de usuario xaml es mucho peor que usar un MergedDictionary en su xaml, donde su estilo está almacenado para su control personalizado (o su generic.xaml). Aprendí esa leason por el camino difícil. Para ser honesto, no veo ningún sentido de usar controles de usuario, pero eso es solo mi opinión personal. – dowhilefor

3

Al usar MVVM, el modelo y el modelo de vista no deberían depender de la vista, es decir, no deberían importar qué tipo de vista usarlos.

La diferencia entre un control personalizado y un control de usuario en WPF es que el control personalizado no tiene aspecto y se puede personalizar a través de ControlTemplate. Esto es lo que debe escribir si está escribiendo una biblioteca de control genérica, como lo hace Microsoft. Sin embargo, si tiene en mente un aspecto específico para su control, simplemente vaya con un control de usuario, es mucho más rápido pero solo tendrá un aspecto, el que defina para él.

Es común usar una combinación de controles personalizados y controles de usuario en un proyecto de MVVM. Por ejemplo, probablemente usaría un grupo de controles personalizados de Microsoft (como cuadros de texto y bloques de texto) y los combinaría en controles de usuario.

Ver Control Authoring Overview

Cuestiones relacionadas