c# xaml uwp win-universal-app

c# - XAML GridView ItemTemplate no se vincula al control



uwp win-universal-app (1)

Dios mío, mira esto aquí:

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

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

Lo siento, tangente. Ahora mira esto:

<ctr:HabitacionControl Width="70" Height="140" Ubicacion="{Binding}"/>

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

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

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, fracasas.

Déjame preguntarte: ¿un TextBox tiene un TextBoxViewModel? No. Tiene una propiedad de Text que se une. ¿Cómo te unes a él? 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 meterse en esta situación en primer lugar.

Debe HabitacionControlVM y exponer DependencyProperties en la superficie de su UserControl con el que su modelo de vista puede unirse, proporcionando lo que necesita su UserControl 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 la interfaz de usuario está bien en el código subyacente.

Si su HabitacionControlVM está realizando trabajos pesados ​​que realmente no deberían estar en el código subyacente, simplemente refactorícelo en las clases a las que llama su código subyacente.

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

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

<GridView ItemsSource="{Binding Ubicaciones.Ubicaciones}"> <GridView.ItemTemplate> <DataTemplate> <ctr:HabitacionControl Width="70" Height="140" Ubicacion="{Binding}"/> </DataTemplate> </GridView.ItemTemplate> </GridView>

Y aquí está mi control de usuario personalizado:

<UserControl x:Class="MySln.Mucama.Controls.HabitacionControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MySln.Mucama.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="200" d:DesignWidth="97"> <UserControl.DataContext> <local:HabitacionControlVM/> </UserControl.DataContext> <Grid> <RelativePanel> <Image x:Name="Puerta" Source="ms-appx:///Assets/Puerta.jpg" Grid.RowSpan="5"/> <TextBlock Text="{Binding Ubicacion.StrNombreMesa,FallbackValue=####}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="AliceBlue" FontWeight="ExtraBold" RelativePanel.AlignHorizontalCenterWithPanel="True"/> </RelativePanel> </Grid> </UserControl>

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 necesito vincular cada Ubicaciones.Ubicaciones a la propiedad Ubicación de mi Customcontrol.

En tiempo de ejecución, mi vista de cuadrícula genera todos mis elementos, pero el enlace a su propiedad de ubicación nunca ocurre.

No hay advertencias en la ventana de salida.

¿Qué me estoy perdiendo? O haciendo mal?