Как я могу изменить цвет текста метки после того, как ее соответствующий родительский элемент (элемент списка) коснулся? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть ListView, который использует ItemTemplate. Я хочу изменить соответствующий цвет текста метки при нажатии на элемент.

Соответствующие части моего кода:

public class Especialidade
{
            public string id { get; set; }
            public string especialidade { get; set; }
            public Color color { get; set; }
}

public List<Especialidade> ListaEspecs;

Я устанавливаю ListView ItemsSource вручную и не использую привязку:

ListViewEspecs.ItemsSource = ListaEspecs;

Код, который должен изменить цвет (цвет должен связываться автоматически)

async void ListViewEspecs_ItemTapped(System.Object sender, Xamarin.Forms.ItemTappedEventArgs e)
{
    var x = e.Item as Especialidade;
    x.color = Color.Orange;
}

Xaml

<ListView x:Name="ListViewEspecs" ItemTapped="ListViewEspecs_ItemTapped" Grid.Column="0" Grid.Row="1" SelectionMode="None" BackgroundColor="Transparent" SeparatorVisibility="None" HorizontalOptions="FillAndExpand" VerticalOptions="StartAndExpand" VerticalScrollBarVisibility="Never" SeparatorColor="Transparent">
    <ListView.ItemTemplate>
         <DataTemplate>
             <ViewCell>
                <Grid Margin="0,0,0,5"> 
                     <Grid.RowDefinitions>
                          <RowDefinition Height="40" />
                     </Grid.RowDefinitions>

                     <Label Text="{Binding especialidade}" Grid.Column="1" Grid.Row="0" FontSize="16" HorizontalTextAlignment="Start" HorizontalOptions="StartAndExpand" VerticalOptions="CenterAndExpand" TextColor="{Binding color}" />
                </Grid> 
             </ViewCell> 
          </DataTemplate> 
      </ListView.ItemTemplate>
</ListView>

Текст метки является ожидаемым, но при нажатии на пункт, приложение замораживается без исключения. Как я могу это сделать?

1 Ответ

0 голосов
/ 19 марта 2020

Согласен с @ Джейсоном Вам необходимо реализовать в модели интерфейс INotifyPropertyChanged .

public class Especialidade : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public string id { get; set; }
    public string especialidade { get; set; }

    Color _color;
    public Color color
    {
        get { return _color; }

        set {

             if(_color!=value)
            {
                _color = value;
                NotifyPropertyChanged("color");
            }

        }
    }

}

Кроме того, поскольку вы использовали MVVM, вы бы лучше поместите все логи c в ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...