XAML GridView ItemTemplate no vinculante para controlar

Tengo un GridView con una ItemTemplate que tiene un control personalizado:

       

Y aquí está mi control:

            

Y su código detrás:

 public sealed partial class HabitacionControl : UserControl { public HabitacionControl() { this.InitializeComponent(); } public MyClass Ubicacion { get { return (MyClass)GetValue(UbicacionProperty); } set { SetValue(UbicacionProperty, value); } } // Using a DependencyProperty as the backing store for Ubicacion. This enables animation, styling, binding, etc... public static readonly DependencyProperty UbicacionProperty = DependencyProperty.Register("Ubicacion", typeof(MyClass), typeof(HabitacionControl), new PropertyMetadata(new PropertyChangedCallback(OnUbicacionChanged))); private static void OnUbicacionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { //... } } 

Ahora debo vincular cada Ubicaciones.Ubicaciones a la propiedad de Ubicación de mi Customcontrol.

En tiempo de ejecución mi gridview genera todos mis elementos, pero el enlace a su propiedad Ubicacion nunca ocurre.

No hay advertencias en la ventana de salida.

¿Qué me estoy perdiendo? O haciendo mal?

Dios mío, mira esto aquí:

    

Alguien te vendió una factura de bienes sucios, inmundos. Probablemente uno de esos idiotas que corren diciéndole a la gente DataContext = this; es una buena idea.

Lo siento, tangente. Ahora mira esto:

  

¿Qué es eso que estoy viendo? ¿Es eso una propiedad pseudo-DataContext? Esa es una propiedad pseudo-DataContext. El problema es que la Binding funciona contra el objeto dentro del DataContext del HabitacionControl no su padre . ¿Y cuál es el DataContext de HabitacionControl ?

    

Y es por eso que no crea modelos de vista para sus UserControls. Has roto cómo funciona el enlace de datos. El modelo de vista debe fluir por el árbol visual a través del DataContext. Cuando interrumpes este flujo, obtienes el error.

Déjame preguntarte: ¿un TextBox tiene un TextBoxViewModel? No. Tiene una propiedad de Text que se une. ¿Cómo te unes a esto? Su modelo de vista fluye a TextBox.DataContext , lo que le permite vincular las propiedades de su modelo de vista a las propiedades expuestas en el TextBox.

Hay otras formas extravagantes de evitar esto, pero la mejor solución es no involucrarse en esta situación en primer lugar.

Necesita deshacerse de HabitacionControlVM y exponer DependencyProperties en la superficie de su UserControl que su modelo de vista puede vincular, proporcionando todo lo que su UserControl necesite para funcionar. Coloque su lógica de UI en el código detrás de HabitacionControl .

No, esto no rompe MVVM. La lógica de UI está bien en el código subyacente.

Si su HabitacionControlVM está realizando un trabajo pesado que realmente no debería estar en el código subyacente, simplemente refactorícelo en las clases a las que su código llama.

La gente piensa que el anti-patrón UserControlViewModel es cómo debería hacerse. Realmente no lo es. Buena suerte.