2010-05-11 27 views
10

(honestamente busqué y leí todas las 'preguntas relacionadas' que parecían relevantes - espero no haber "perdido" esta pregunta de otro lado pero aquí va ...)¿Dónde debo configurar el código de DataContext detrás o xaml?

Hay dos formas diferentes (en menos) para establecer el DataContext. Uno puede usar XAML o uno puede usar el código detrás.

¿Cuál es la 'mejor práctica' y por qué?

Tiendo a preferir configurarlo en XAML porque permite que un diseñador defina colecciones por sí mismo, pero necesito 'munición' sobre por qué es una buena práctica o por qué estoy loco y el código detrás es la bomba.

Respuesta

2

Creo que depende de a qué está configurando el DataContext y, en última instancia, de las preferencias personales.

Personalmente siempre lo hago en el código detrás de mis vistas porque me parece más limpio, y así fue como me enseñaron MVVM. Otra cosa a tener en cuenta es que, en ocasiones, es posible que deba cambiar el contexto de datos según el trabajo con el que esté trabajando. Si este es el caso, es mucho más limpio/más fácil de hacer en el código detrás que en XAML.

0

DataContext del control/vista del usuario Supongo? Una ventaja de establecer contexto de datos en el código subyacente es la disponibilidad de inyección de dependencia. Su contenedor DI puede encargarse de cualquier dependencia de forma dinámica durante el tiempo de ejecución.

Con este patrón, con frecuencia configuré un diseño de mezcla de mezcla DataContext en xaml usando d: DataContext. La "versión de diseño" puede proporcionar datos falsos para usar en Blend, mientras que la verdadera implementación se resuelve en tiempo de ejecución.

+0

seguro que este es el tipo de cosa que estoy buscando ... personalmente prefiero configurarlo en el xaml. para mí establecerlo en el código subyacente se vuelve complicado ya que * puedes * configurar el contexto de datos 'en cualquier lugar', por lo que a veces el seguimiento 'dónde' es un problema ... esto es más parecido al tipo de 'razones para usar de una manera u otro 'estoy buscando ...(en este caso los "datos falsos" en combinación es la "razón") – dovholuk

4

Una tercera forma en que puede ver es utilizar un servicio de localización. Normalmente tengo una clase que es responsable de la creación de todos mis DataContext (VM en la mayoría de los casos para mí) y creo una instancia de esa clase en los recursos de App.xaml. Luego enlace el DataContext en el XAML de cada página individual.

decir

<Page DataContext="{Binding ViewModel,Source={StaticResource Locator}}" > 
1

Como se puede ver por las respuestas hasta ahora la opinión está dividida. En verdad, no hay una mejor práctica (me interesa mucho el tema de las "mejores prácticas" en el mundo de Silverlight, es demasiado joven para que las mejores prácticas sean verdaderamente conocidas).

La realidad es que tú no puede establecer el "contexto de datos" en Xaml. A menos que realmente construir una instancia de objeto de esta manera: -

<UserControl> 
    <UserControl.DataContext> 
    <local:MyDataProviderThing /> 

En última instancia algo externo tiene que asignar o bien propiedad DataContext directa o indirectamente a través de otra propiedad o mediante la unión (como en la respuesta de Stephan). Es este contexto externo el que dicta si tiene sentido hacerlo en Xaml o no. Muchas soluciones de MVVM usan un enlace en Xaml, en algunos casos simplemente para evitar tener que haber ningún código en código subyacente en lugar de ser realmente "mejor". Otros configuran el DataContext en código usando una clase base de la que deriva su control.

+0

me confunden - la publicación de stephan muestra claramente (bueno para mí de todos modos) cómo establecer el contexto de datos a través de xaml, así que puedes aclarar a qué te refieres cuando dices no puede establecer el contexto de datos en xaml por favor? gracias – dovholuk

+1

@dovholuk: Note mi uso del contexto de datos "en". Sí, puede asignar un objeto a la propiedad 'DataContext' en Xaml. Pero como la respuesta de Stephan muestra que todo lo que se está asignando en realidad es un' Enlace'. en sí mismo no es realmente el "contexto de datos". El objeto real asignado para ser el "contexto de datos" se realiza en código en la propiedad 'ViewModel' del objeto asignado a un recurso estático llamado' Locator'. – AnthonyWJones

Cuestiones relacionadas