Home > Enterprise >  BInding textColor in Xamarin
BInding textColor in Xamarin

Time:11-29

In a Xamarin app I’m trying to bind a textcolor with a property in Message model.

public class Message : INotifyPropertyChanged
{
    public string text { get; set; }
    public Color color { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
}

The task is, when I click on a label in a collectionview the text should change to Gray.

I can change the color in the ObservableCollection: this.messages = new ObservableCollection(); (that’s works, and if I delete an entry in the ObservableCollection the screen updates)

But when I change the color in the message model, the screen doesn’t update.

I use MVVMhelpers, and I would like to use that to solve the problem, if possible.

best regards..

CodePudding user response:

You could change the item color to gray when you click the item to triger the SelectionChanged event of CollectionView.

Xaml:

   <CollectionView ItemsSource="{Binding messages}" SelectionMode="Single" SelectionChanged="CollectionView_SelectionChanged">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Label Text="{Binding text}" TextColor="{Binding color}"></Label>
            </DataTemplate>
        </CollectionView.ItemTemplate>
        </CollectionView>    

Code behind:

 public partial class Page2 : ContentPage
{
    public ObservableCollection<Message> messages { get; set; }
    public Page2()
    {
        InitializeComponent();
        messages = new ObservableCollection<Message>()
        {
            new Message(){ text="A", color="Red"},
            new Message(){ text="B", color="Red"},
            new Message(){ text="C", color="Red"},

        };
        this.BindingContext = this;

    }

    private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var previousItem = e.PreviousSelection.FirstOrDefault() as Message;
        var currentItem = e.CurrentSelection.FirstOrDefault() as Message;
        currentItem.color = "Gray";

        if (previousItem!=null)
        {
            previousItem.color = "Red";
        }
    }
}
public class Message : INotifyPropertyChanged
{
    private string _text;
    public string text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            OnPropertyChanged("text");
        }
    }
    private string _color;
    public string color
    {
        get
        {
            return _color;
        }
        set
        {
            _color = value;
            OnPropertyChanged("color");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

CodePudding user response:

super, great thanks.

I should also add

<DataTemplate x:DataType="{x:Type Models:Message}">
  • Related