выберите каждый ListViewItem и примените модификацию в универсальном приложении

У меня есть ListView, который отображает эту информацию, я хочу отобразить другой фон для моей кнопки. Если я получаю fav = 1, и другое изображение, если я получаю aime = 1: формат JSON:

{
success: 1,
total: 2,
locals: [
{
id_local: "82",
fav: 0,
aime: 0,
aimepas: 0,
all_like: "2",
all_dislike: "0",
},
{
id_local: "83",
fav: 1,
aime: 1,
aimepas: 0,
all_like: "5",
all_dislike: "0",
}
]
}

и это мой код:

            Uri = "URL";
            var http = new HttpClient();
            http.MaxResponseContentBufferSize = Int32.MaxValue;
            var response = await http.GetStringAsync(Uri);
            var rootObject = JsonConvert.DeserializeObject<Project.Models.RootObject>(response);

            listme.ItemsSource = rootObject.locals;


                for (int i = 0; i < int.Parse(rootObject.total); i++) {

                    if (rootObject1.locals[i].fav == 1)
                    {
                        m_button.Background = new SolidColorBrush(Color.FromArgb(255, 251, 187, 9)); //color1 :Yellow
                    }

                    else
                    {
                        m_button.Background = new SolidColorBrush(Color.FromArgb(255, 178, 178, 178));//color2 :Gray
                    }

                    if (rootObject1.locals[i].aime == 1)
                    {
                        likeimage.Source = new BitmapImage(new Uri("ms-appx:///images/coueur_rouge.png", UriKind.Absolute)); //image1
                    }

                    else
                    {
                        likeimage.Source = new BitmapImage(new Uri("ms-appx:///images/like.png", UriKind.Absolute)); //image2
                    }

                }

это мой xaml:

<ListView  x:Name="listme">
 <ListView.ItemTemplate >
   <DataTemplate >
     <Grid>
       ...
      <Button Background="Gray"  x:Name="m_button"/>
      <Button  Background="Gray" >
           <Image Source="images/like.png" x:Name="likeimage"/>
        </Button>
     </Grid>
   </DataTemplate >
 </ListView.ItemTemplate >
</ListView >

то, что я получаю, это 2 элемента списка, без каких-либо изменений, помогите, пожалуйста, в том, как я могу исправить свой код, спасибо за помощь

Обновление: я использовал foreach, как это, но у меня все еще есть проблема с ListViewItems:

listme.ItemsSource = rootObject1.locals;

                    foreach (var item in listme.Items.Cast<Locals>())
                    {

                        if (item.fav == 1)
                            {
                                m_button.Background = new SolidColorBrush(Color.FromArgb(255, 251, 187, 9)); //jaune
                            }

                            else
                            {
                                m_button.Background = new SolidColorBrush(Color.FromArgb(255, 178, 178, 178));//gris
                            }

                            if (item.aime == 1)
                            {
                                likeimage.Source = new BitmapImage(new Uri("ms-appx:///images/coueur_rouge.png", UriKind.Absolute));
                            }

                            else
                            {
                                likeimage.Source = new BitmapImage(new Uri("ms-appx:///images/like.png", UriKind.Absolute));
                            }

                    }

например, когда я выбираю кнопку из элемента с индексом = 0, элемент с индексом = 1 будет изменен, я не знаю, почему я получаю этот результат! >_‹


person user3821206    schedule 09.02.2016    source источник


Ответы (1)


Прочитав его 2 раза, я понял, что вы хотите сделать. Логика вашего кода неверна. Вы не можете использовать x:names в listItems, потому что код не знает, с кем разговаривать. Вы должны использовать привязки.

Обзор привязки данных

INotifyPropertyChanged.PropertyChanged

Создайте класс для элементов списка

public class Item : INotifyPropertyChanged
{
    private Uri thumbnail;
    public Uri Thumbnail
    {
        get { return thumbnail; }
        set
        {
            thumbnail = value;
            NotifyPropertyChanged("Thumbnail");
        }
    }

    private SolidColorBrush buttonColor = new SolidColorBrush(Color.FromArgb(255, 178, 178, 178));
    public SolidColorBrush ButtonColor
    {
        get { return buttonColor; }
        set
        {
            buttonColor = value;
            NotifyPropertyChanged("ButtonColor");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
        }
    }
}

XAML

<ListView  x:Name="listme">
 <ListView.ItemTemplate >
   <DataTemplate >
     <Grid>
       ...
      <Button Background="{Binding ButtonColor} Tapped="Button_Tapped"/>
      <Button  Background="Gray" >
           <Image Source="{Binding Thumbnail}"/>
        </Button>
     </Grid>
   </DataTemplate >
 </ListView.ItemTemplate >
</ListView >

А затем загрузите такие предметы

//This one outside
        ObservableCollection<Item> Locals = new ObservableCollection<Item>();

    //in method or constractor
    //foreach
    Item listItem = new Item();
    listItem.Thumbnail = new Uri("ms-appx:///images/coueur_rouge.png", UriKind.Absolute);
    listItem.ButtonColor = new SolidColorBrush(Color.FromArgb(255, 251, 187, 9));
    Locals.Add(listItem);
    //end foreach

    // then do 
    listme.ItemsSource = Locals;

Чтобы получить предмет на кнопку нажмите

private void Button_Tapped(object sender, TappedRoutedEventArgs e)
        {
            Item selectedItem = ((FrameworkElement)sender).DataContext as Item;
            SelectedItem.Thumbnail = null;//whatever you like
            SelectedItem.ButtonColor = null;//whatever you like
        }

Возможно, вам придется использовать IValueConverter для отображения значений в xaml, но я думаю, что это сработает, если нет, возможно, вам придется изменить типы данных.

person Stamos    schedule 09.02.2016
comment
Пожалуйста. P.S. Я отредактирую и добавлю способ нажать кнопку для одного элемента и сделать это только в этом элементе. Также я изменю код, так что будьте осторожны. - person Stamos; 09.02.2016
comment
Сэр, как насчет данных из веб-службы? Должен ли я установить listme.ItemsSource = rootObject.locals; перед listme.ItemsSource = Locals;?? - person user3821206; 10.02.2016
comment
Вы устанавливаете его только один раз. Вы можете с самого начала сделать или изменить свой тип rootObject.locals тоже типом Locals. Это означает, что вы будете выполнять только listme.ItemsSource = rootObject.locals; и никакой другой код не потребуется для загрузки вашего списка. - person Stamos; 10.02.2016