Xamarin.forms: Xamarin Forms Content View (User Control) não vinculativo dentro de ListView

Criado em 15 mai. 2018  ·  3Comentários  ·  Fonte: xamarin/Xamarin.Forms

Descrição

Há um ListView vinculado a um ObservableCollection de string. Listview tem um rótulo e um ContentView (contendo nada além de um rótulo). Ambos estão vinculados à mesma coleção.

Além disso, existe um botão que gera alguns dados aleatórios para a coleção.

O problema é que quando eu executo o aplicativo e clico no botão Gerar dados, o rótulo é atualizado, mas não o ContentView.

Passos para reproduzir

  1. Abra o VS 2017 e crie um novo projeto em branco do Xamarin Forms (padrão)
  2. Em MainPage.xaml coloque um StackLayout com um botão e um Listview
  3. Defina DataTemplate do Listview como ViewCell contendo um Label e um ContentView (iremos criá-lo abaixo). Vincule a propriedade Text a itens ObservableCollection.
  4. Em MainPage.xaml.cs crie um Observalbepropriedade
  5. No construtor, inicialize a coleção Observable com alguns valores aleatórios e defina o contexto de ligação para isso.
  6. Inscreva-se no clique de botão e atribua alguns valores aleatórios à coleção observável sempre que o botão for pressionado.
  7. Crie um novo ContentView (xaml) usado acima e coloque um rótulo dentro dele vinculado à propriedade Text
  8. Em xaml.cs, crie um Texto de propriedade vinculável.
  9. Ou você pode simplesmente descompactar e abrir a solução anexada no VS 2017 (15.7.1)
    TestSample.zip
  10. Execute no Android e clique no botão gerar.
  11. Observe que o texto vinculado ao rótulo está mudando, no entanto, o texto vinculado a ContentView não muda.

Comportamento esperado

O rótulo dentro da Visualização de Conteúdo também deve mudar.

Comportamento Real

O rótulo dentro da Visualização de Conteúdo permanece o mesmo

Informação básica

  • Versão com problema: 4.10.0.442
  • Última versão válida:
  • IDE: VS 2017 (15.7.1)
  • Estruturas de destino da plataforma:

    • iOS:

    • Android: 8.3.0.19

    • UWP:

  • Versão da Biblioteca de Suporte Android:
  • Pacotes Nuget:
    Xamarin.Forms
    NETStandard.Library

  • Dispositivos afetados:

Capturas de tela

Link de reprodução

https://github.com/AppGrate/ListViewBindingIssue

question

Comentários muito úteis

fazendo

this.BindingContext = this;

em MagicBox.xaml.cs força o BindingContext para o objeto atual. Isso também significa que o BindingContext do pai não é mais herdado.

a fim de fazê-lo funcionar, altere seu código atrás para

    [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 ();
        }
    }

e seu xaml para

<?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 comentários

fazendo

this.BindingContext = this;

em MagicBox.xaml.cs força o BindingContext para o objeto atual. Isso também significa que o BindingContext do pai não é mais herdado.

a fim de fazê-lo funcionar, altere seu código atrás para

    [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 ();
        }
    }

e seu xaml para

<?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>

Obrigado @StephaneDelcroix , funcionou :)

Esta página foi útil?
0 / 5 - 0 avaliações