2017-06-18 3 views
0

J'ai créé un ViewCell personnalisé qui est censé être utilisé dans mon ListView Le même code fonctionne sur Android mais pas sur UWP (Windows Phone et Windows Desktop).Xamarin.UWP Personnalisé ViewCell a des problèmes avec les liaisons

Le projet est Xamarin Forms.

Differences

Quand je l'utilise dans mon ListView ... je ne peux voir des cellules vides.

<?xml version="1.0" encoding="UTF-8"?> 
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="AAA.Extensions.AttributeViewCell" 
      Tapped="AttributeViewCell_OnTapped" 
      > 
<Grid 
    x:Name="AttributeGrid" 
    > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <StackLayout 
     Grid.Column="0" 
     > 
     <Label 
      Text="{Binding Code}" 
      TextColor="#000000" 
      /> 
     <Label 
      Text="{Binding Description}" 
      TextColor="#000000" 
      /> 
    </StackLayout> 

    <StackLayout 
     Grid.Column="1" 
     x:Name="DynamicContentStackLayout" 
     > 

    </StackLayout> 
</Grid> 

Mon code derrière

[XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class AttributeViewCell : ViewCell 
    { 
     #region Bindable Properties 
     public static readonly BindableProperty CodeProperty = BindableProperty.Create(nameof(Code),typeof(string),typeof(AttributeViewCell), defaultBindingMode:BindingMode.TwoWay); 
     public static readonly BindableProperty DescriptionProperty = BindableProperty.Create(nameof(Description), typeof(string), typeof(AttributeViewCell), defaultBindingMode:BindingMode.TwoWay); 
     #endregion 

     #region Properties 
     /// <summary> 
     /// Attribute Code 
     /// </summary> 
     public string Code 
     { 
      get => (string) GetValue(CodeProperty); 
      set => SetValue(CodeProperty,value); 
     } 

     /// <summary> 
     /// Attribute's description 
     /// </summary> 
     public string Description 
     { 
      get => (string) GetValue(DescriptionProperty); 
      set => SetValue(DescriptionProperty, value); 
     } 
     #endregion 

     public AttributeViewCell() 
     { 
      InitializeComponent(); 
      this.BindingContext = this; 
     } 

     private void AttributeViewCell_OnTapped(object sender, EventArgs e) 
     { 
      // I CAN SEE BINDINGS here... 
     } 
    } 

La liaison se fait à travers un ViewModel regard de POCO comme ce qui suit

public class Attribute 
    { 
     public string Code { get; set; } 
     public string Description { get; set; } 
    } 

VM cla publique ss ProductDetailsPageViewModel: BaseViewModel { #region Champs private readonly AnonymousCheckerService _anonymousCheckerService; private Liste _attributes;

 #endregion 

     #region Properties 

     public List<Attribute> Attributes 
     { 
      get => _attributes; 
      set 
      { 
       _attributes = value; 
       OnPropertyChanged(); 
      } 
     } 

     #endregion 

     //basic ctor 
     public ProductDetailsPageViewModel() 
     { 
      _aaa= new aaa(); 
      Attributes = _aaa.GetInfo("123").Attributes; 
     } 
    } 

Et enfin, le ListView

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:extensions="clr-namespace:AnonymousCheckerApp.Extensions" 
      x:Class="AnonymousCheckerApp.Views.ProductDetailsPage"> 
    <StackLayout> 
     <ListView 
      ItemsSource="{Binding Attributes}" 
      > 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <extensions:AttributeViewCell 
         Code="{Binding Code}" 
         Description="{Binding Description}" 
         AttributeDetails="{Binding AttributeDetails}" 
         /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 
</ContentPage> 

and it's codebehind 
public ProductDetailsPage() 
     { 

      var vm = new ProductDetailsPageViewModel(); 
      this.BindingContext = vm; 

      InitializeComponent(); 
     } 

Je joins un événement taraudés sur la viewcell ... Je peux voir les fixations ...

enter image description here

Édition 1

J'ai comm J'ai trouvé d'autres développeurs ayant des problèmes de liaison avec des éléments empilés dans Grid éléments ... Toujours pas fonctionnant et ce qui est bizarre, c'est qu'il "analyse" correctement les éléments XAML, mais il ne parvient pas à faire la liaison ....Qu'est-ce que je fais mal ?

enter image description here

C'est à quoi il ressemble sur Android enter image description here

+0

est-il pas un autre problème, peut-être le texte est blanc pour une raison quelconque? Pourriez-vous mettre le 'TextColor' en rouge ou quoi que ce soit juste pour l'exclure :) –

+0

J'ai mis à jour le thread principal ... ne fonctionne toujours pas, si je remplace le texte = {Binding} avec une valeur codée, il rendra . – ExtremeSwat

Répondre

1

J'ai testé votre code et reproduit votre question. Cette ligne this.BindingContext = this; est inutile. Parce que le AttributeViewCell hérite ViewCell et vous pouvez l'utiliser directement dans ListView DataTemplate. Donc, veuillez supprimer le code de ligne suivant du constructeur AttributeViewCell.

this.BindingContext = this; 

enter image description here