0
votes

Puis-je définir la couleur d'un bouton à l'intérieur d'une liste XAMARIN.FORMS ListView par programme?

J'ai une liste de liste avec un bouton défini à l'intérieur d'un ViewCell . Je voudrais savoir comment je peux mettre à jour la couleur de ce bouton de manière programmatique.

C'est ainsi que ma listeView est définie dans xaml. xxx

La source de données est une base de données SQLITE que j'ai définie dans C #: xxx < / PRE>

Le bouton de détail sélectionne la ligne Il est activé et navigue sur un détail de détail construit avec les données d'en-tête de la ligne sélectionnée. Le détail contient une deuxième liste de réception, celle-ci d'une table de détail, qui est liée à la table d'en-tête par une clé étrangère. Chaque ligne de la table de détail a une propriété BOOL de complet . Les itemsource de la liste de Détails de l'espace deToutes sont définis de la même manière que la hearherlistview.

Quelques échantillons de code pour refléter ce que mes tables ressemblent à: xxx

le comportement souhaité Pour que mon bouton de détail sur la tête de têteView est comme suit:

1) BackgroundColor = "bleu" Lorsque l'en-tête n'a pas de lignes de détail correspondantes, il n'y a pas d'éléments dans la liste de détails .

2) BackgroundColor = "orange" Lorsque l'en-tête porte au moins une ligne de détail correspondante (et donc au moins un élément de la liste de détails de DotailPage), et tout les lignes ' complète La propriété est définie sur false .

3) BackgroundColor = "vert" quand le Detailpage a au moins une ligne de correspondance, et tout de ses propriétés complète est définie sur true . S'il n'y a qu'une seule ligne qui correspond à l'en-tête et à sa propriété ' complète est true , puis le bouton de détail est toujours vert.

s'il vous plaît non Suggestions d'outils personnalisés Sauf absolument aucun moyen de le faire avec des outils XAMARIN par défaut.


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser des styles avec des déclencheurs dans XAML.

Votre viewModel pourrait avoir des getters qui renvoient une couleur / style pour la colonne à utiliser, vous pouvez ensuite lier les couleurs de la colonne à cela.

ou vous pouvez le faire de manière programmatique en attribuant le fond de l'en-têteColor en fonction des données telles que datagrid.columns [0] .backgroundColor = Nouveau Solidbrush ("bleu"); ou quelque chose comme ça.


2 commentaires

Pourriez-vous partager un extrait qui fait cela?


Vérifiez ici: Stackoverflow.com/ Questions / 14395781 / ...



1
votes

Dans votre XAML, vous devez définir la liaison à l'arrière-plan de votre bouton: xxx pré>

et dans le code derrière, définissez la valeur sur BTNColor code> dans différentes situations Dans votre en-tête code>: p> xxx pré>

ajoutez une propriété BTNColor dans votre modèle: p>

public class Header
{
    public int HeaderId { get; set; } // The primary key of the Header table
    public string Code { get; set; } // Foreign key of the Detail table

    // various Header data
     public Color btnColor { get; set; }

}


2 commentaires

Cela fonctionne exactement comment je voulais cela, merci! Une note pour quiconque à partir de l'avenir, stockez la propriété BTNColor sous forme de chaîne non de couleur car SQLite n'accepte pas les colonnes de type couleur. Je n'avais pas besoin d'utiliser un convertisseur du tout, juste lier le fond de l'arrière-plan sur la propriété de cordes pour moi, mais juste au cas où voici un tutoriel que j'ai trouvé pour construire des convertisseurs à cordes à couleurs: Forums.xamarin.com/discussion/ 37751 / ...


Pourquoi voulez-vous stocker la couleur dans SQLite lorsque la couleur dépend des données trouvées dans SQLite? Ça n'a aucun sens.



1
votes

IIRC, je vous ai donné une réponse similaire à une question similaire auparavant. Vous devriez encore créer une vue de vie à l'intérieur de votre viewModel. XXX

Puis dans votre visionnel principal, pour chaque élément d'en-tête, créez une instance HearViewModel, mettez-les dans une observation d'observation, et de les lier comme l'itemsSource de La listeView: xxx

puis dans votre exemple XAML ci-dessus, modifiez les deux balises telles que ceci:


0 commentaires