Existe-t-il un moyen de lier l'état de FontColor of Label dans Xamarin afin qu'il mette en évidence l'étiquette lorsque Entry (textbox) obtient le focus ?

<CollectionView x:Name="documentsListView" ItemsSource="{Binding DocumentsList}">
                    <CollectionView.ItemsLayout>
                        <LinearItemsLayout Orientation="Vertical"
                           ItemSpacing="0" />
                    </CollectionView.ItemsLayout>
                    <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="3*" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Label Grid.Column="0"
                               Margin="0,10,0,0"
                               Text="{Binding Name}"  FontSize="Body"/>
                            <Entry Grid.Column="1" Grid.RowSpan="1"
                               IsPassword="False"
                               Keyboard="Numeric"
                               Placeholder="{Binding Count}"
                               Text="{Binding Count, Mode=OneWayToSource}"
                               Unfocused="{Binding OnTextboxLostFocus}"
                               Focused="{Binding OnTextboxGotFocus}"/>
                        </Grid>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

Je dois mettre en évidence l'élément qui va être modifié lorsque l'utilisateur entre des données dans l'Entrée (zone de texte), et parce que l'espace entre les éléments dans CollectionView doit être moindre pour que je puisse afficher autant de données par défilement que possible, cela pourrait être déroutant l'utilisateur quel élément exactement il est en train de changer. J'ai pensé à passer une étiquette en tant que paramètre aux événements mais je n'ai pas trouvé comment lier l'étiquette.

0
Miraziz 11 nov. 2020 à 19:48

1 réponse

Meilleure réponse

Liez le textColor de l'étiquette à une propriété dans le modèle et mettez à jour ce textColor lorsque le entry focused/unfocused.

Voici un exemple que j'utilise :

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        this.BindingContext = new DncMvvmPageModel();
    }
}

public class DncMvvmPageModel
{
    public ObservableCollection<Document> DocumentsList { get; set; }
    public Command OnTextboxLostFocus { get; }
    public Command OnTextboxGotFocus { get; }

    public DncMvvmPageModel()
    {
        OnTextboxLostFocus = new Command(OnTextboxLostFocusMethod);
        OnTextboxGotFocus = new Command(OnTextboxGotFocusMethod);

        DocumentsList = new ObservableCollection<Document>();

        DocumentsList.Add(new Document() {TextColor = Color.Gray });
        DocumentsList.Add(new Document() { TextColor = Color.Gray });
        DocumentsList.Add(new Document() { TextColor = Color.Gray });
        DocumentsList.Add(new Document() { TextColor = Color.Gray });
    }

    public void OnTextboxLostFocusMethod(object sender) {
        FocusEventArgs args = sender as FocusEventArgs;
        Entry entry = args.VisualElement as Entry;
        Document docu = entry.BindingContext as Document;

        docu.TextColor = Color.Red;
    }

    public void OnTextboxGotFocusMethod(object sender)
    {
        FocusEventArgs args = sender as FocusEventArgs;
        Entry entry = args.VisualElement as Entry;
        Document docu = entry.BindingContext as Document;

        docu.TextColor = Color.Blue;
    }
}

public class Document : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    Color textColor;

    public Color TextColor
    {
        set
        {
            if (textColor != value)
            {
                textColor = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("TextColor"));
                }
            }
        }
        get
        {
            return textColor;
        }
    }
}

Et en Xaml:

<CollectionView x:Name="documentsListView" ItemsSource="{Binding DocumentsList}">
    <CollectionView.ItemsLayout>
        <LinearItemsLayout Orientation="Vertical"
                       ItemSpacing="0" />
    </CollectionView.ItemsLayout>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="3*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Label Grid.Column="0"
                           Margin="0,10,0,0"
                           Text="Name"  FontSize="Body" TextColor="{Binding TextColor}"/>
                <Entry Grid.Column="1" Grid.RowSpan="1"
                           IsPassword="False"
                           Keyboard="Numeric"
                           Placeholder="placeholder"
                           Text="Count">

                    <Entry.Behaviors>
                        <behaviors:EventToCommandBehavior EventName="Focused"
                                      Command="{Binding BindingContext.OnTextboxGotFocus, Source={x:Reference MyPage}}" />
                        <behaviors:EventToCommandBehavior EventName="Unfocused"
                                      Command="{Binding BindingContext.OnTextboxLostFocus, Source={x:Reference MyPage}}" />
                    </Entry.Behaviors>

                </Entry>
                  
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

Résultat:

enter image description here

N'hésitez pas à me poser n'importe quelle question si vous en avez :).

1
Jack Hua 12 nov. 2020 à 07:18