Xamarin.forms: La vista de contenido de Xamarin Forms (control de usuario) no se vincula dentro de ListView

Creado en 15 may. 2018  ·  3Comentarios  ·  Fuente: xamarin/Xamarin.Forms

Descripción

Hay un ListView enlazado a un ObservableCollection de cadena. Listview tiene una etiqueta y un ContentView (que no contiene nada más que una etiqueta). Ambos están vinculados a la misma colección.

Además, hay un botón que genera algunos datos aleatorios para la colección.

El problema es que cuando ejecuto la aplicación y hago clic en el botón Generar datos, la etiqueta se actualiza pero no el ContentView.

Pasos para reproducir

  1. Abra VS 2017 y cree un nuevo proyecto en blanco de Xamarin Forms (estándar)
  2. En MainPage.xaml, coloque un StackLayout con un botón y una vista de lista
  3. Establezca DataTemplate de Listview en ViewCell que contiene una etiqueta y un ContentView (lo crearemos a continuación). Vincula la propiedad Text a los elementos de ObservableCollection.
  4. En MainPage.xaml.cs crea un Observalbepropiedad
  5. En el constructor, inicialice la colección Observable con algunos valores aleatorios y establezca el contexto de enlace en this.
  6. Suscríbase para hacer clic en el botón y asigne algunos valores aleatorios a la colección observable cada vez que se presione el botón.
  7. Cree un nuevo ContentView (xaml) utilizado anteriormente y coloque una etiqueta dentro de él enlazada a la propiedad Text
  8. En xaml.cs, cree un texto de propiedad enlazable.
  9. O simplemente puede descomprimir y abrir la solución adjunta en VS 2017 (15.7.1)
    TestSample.zip
  10. Ejecute en Android y haga clic en el botón generar.
  11. Observe que el texto enlazado a la etiqueta está cambiando; sin embargo, el texto enlazado a ContentView no cambia.

Comportamiento esperado

La etiqueta dentro de la vista de contenido también debería cambiar.

Comportamiento real

La etiqueta dentro de la vista de contenido sigue siendo la misma

Información básica

  • Versión con problema: 4.10.0.442
  • Última versión buena conocida:
  • IDE: VS 2017 (15.7.1)
  • Marcos de destino de la plataforma:

    • iOS:

    • Android: 8.3.0.19

    • UWP:

  • Versión de la biblioteca de soporte de Android:
  • Paquetes Nuget:
    Xamarin.Forms
    NETStandard.Library

  • Dispositivos afectados:

Capturas de pantalla

Enlace de reproducción

https://github.com/AppGrate/ListViewBindingIssue

question

Comentario más útil

haciendo

this.BindingContext = this;

en MagicBox.xaml.cs fuerza el BindingContext al objeto actual. También significa que el BindingContext del padre ya no se hereda.

para que funcione, cambie su código detrás a

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MagicBox : ContentView
    {

        public static readonly BindableProperty TextProperty =
            BindableProperty.Create("Text", typeof(string), typeof(MagicBox), default(string));

        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public MagicBox ()
        {
            InitializeComponent ();
        }
    }

y tu xaml a

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestSample.Controls.MagicBox"
             x:Name="box">
  <ContentView.Content>
      <Grid>
          <Label Text="{Binding Text, Source={x:Reference box}}" />
      </Grid>
  </ContentView.Content>
</ContentView>

Todos 3 comentarios

haciendo

this.BindingContext = this;

en MagicBox.xaml.cs fuerza el BindingContext al objeto actual. También significa que el BindingContext del padre ya no se hereda.

para que funcione, cambie su código detrás a

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MagicBox : ContentView
    {

        public static readonly BindableProperty TextProperty =
            BindableProperty.Create("Text", typeof(string), typeof(MagicBox), default(string));

        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public MagicBox ()
        {
            InitializeComponent ();
        }
    }

y tu xaml a

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestSample.Controls.MagicBox"
             x:Name="box">
  <ContentView.Content>
      <Grid>
          <Label Text="{Binding Text, Source={x:Reference box}}" />
      </Grid>
  </ContentView.Content>
</ContentView>

Gracias @StephaneDelcroix , funcionó :)

¿Fue útil esta página
0 / 5 - 0 calificaciones