2017-01-17 2 views
0

Я пытаюсь добавить тег в свой элемент ListView (например, добавить тег к кнопке).Добавление тега в элемент списка ListView XAML [UWP]

Мой XAML:

 <ListView x:Name="gamesList" IsItemClickEnabled="True" ItemClick="gamesList_ItemClick"> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <ContentPresenter/> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ListView.ItemContainerStyle> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <Grid Height="200" Width="896"> 
          <Rectangle Fill="#FFCCCCCC" HorizontalAlignment="Left" Height="64" Margin="10,71,0,0" Stroke="#FFCCCCCC" VerticalAlignment="Top" Width="100"/> 
          <TextBlock x:Name="voteCount" HorizontalAlignment="Left" Margin="50,79,0,0" TextWrapping="Wrap" Text="{Binding Votes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Foreground="#FF107C10" FontWeight="Bold"/> 
          <TextBlock x:Name="voteCountText" HorizontalAlignment="Left" Margin="37,104,0,0" TextWrapping="Wrap" Text="votes" VerticalAlignment="Top" Foreground="#FF292C33"/> 
          <Button x:Name="voteButton" Tag="{Binding Slug, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Content="{Binding BtnVoted, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="10,143,0,0" VerticalAlignment="Top" Width="100" Background="#FF888888" Foreground="#FF292C33" Click="voteButton_Click" IsEnabled="{Binding BtnEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
          <TextBlock x:Name="voteTitle" HorizontalAlignment="Left" Margin="144,80,0,0" TextWrapping="Wrap" Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" FontSize="22" Foreground="#FF292C33"/> 
          <TextBlock x:Name="voteError" HorizontalAlignment="Left" Margin="144,115,0,0" TextWrapping="Wrap" Text="You already voted for this game" VerticalAlignment="Top" Visibility="{Binding Voted, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
          <Rectangle Fill="Black" HorizontalAlignment="Left" Height="4" Margin="10,180,0,0" Stroke="#FFCCCCCC" VerticalAlignment="Top" Width="801"/> 
         </Grid> 
        </StackPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

C# (частично):

 public async void OnLoaded(object sender, RoutedEventArgs e) 
     { 
      var response = await start(); 

      dynamic dynJson = JsonConvert.DeserializeObject(response); 

      foreach (var item in dynJson) 
      { 
       Object votedGame = localSettings.Values[item.slug.ToString()]; 
       string voted = "Collapsed"; 
       string btnVoted = "VOTE"; 
       bool btnEnabled = true; 

       if(votedGame != null) 
       { 
        voted = "Visible"; 
        btnVoted = "VOTED!"; 
        btnEnabled = false; 
       } 

       listofGames.Add(new Games { Title = item.name, Votes = item.votes, Slug = item.slug, Voted = voted, BtnVoted = btnVoted, BtnEnabled = btnEnabled }); 
      } 

      gamesList.ItemsSource = listofGames; 
     } 

     public class Games 
     { 
      public string Title { get; set; } 
      public string Slug { get; set; } 
      public string Voted { get; set; } 
      public string BtnVoted { get; set; } 
      public bool BtnEnabled { get; set; } 
      public int Votes { get; set; } 
     } 

Тег должен содержать сведения о (в данном случае) название игры.

Итак, когда пользователь нажимает на элемент, функция щелчка должна обрабатывать событие, и мне нужно иметь возможность получить данные из тега.

+2

Как вы добавляете ярлык на кнопку? Вы говорите о свойстве «Tag»? Не делайте этого, используйте MVVM. Кроме того, немного не по теме - можете ли вы объяснить свой «ItemContainerStyle»? –

+0

@EdPlunkett Да, я говорил о свойстве 'Tag'. Я хотел бы получить тот же результат для 'ListViewItem', что и для' Button'. И я следил за учебником, поэтому я не знаю, почему «ItemContainerStyle» еще есть. Я довольно новичок в XAML – Chris

+1

Как вы заполняете ListView? Если в учебнике не было указано, что вы привязываете ObservableCollection к ListView.ItemsSource, это плохой учебник, и вы должны найти другое. –

ответ

3

Вам не нужен тег. В XAML элементы управления коллекцией, такие как ListView, выбирают фактический экземпляр класса, который вы им дали. Они стараются избегать того, чтобы вы в максимально возможной степени договорились с ListViewItems. Итак, e.ClickedItem в вашем обработчике событий не будет ListViewItem; это будет ваш номер, один из Games экземпляров, которые вы предоставили ListView.ItemsSource в своем List<Games>. Не нужно возиться с Tag, как в день дедушки.

private void listView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    //var lv = sender as ListView; 
    Games clickedGames = e.ClickedItem as Games; 

    // Do stuff with the clicked item. 
} 

Кстати, это выглядит из вашего кода, как будто listofGames является частным полем. Это не очень хорошая идея. Поскольку это не ObservableCollection, все дополнения или абзацы из этого списка не будут отображаться в ListView, поэтому список должен быть действительно локальным для метода OnLoaded, чтобы этого не происходило. Или еще лучше, измените его тип на ObservableCollection<Games>. Это будет замена на List<T>.

Как я уже сказал, я думаю, вы, к сожалению, наткнулись на очень плохой учебник.

«Правильный» способ сделать это (и на самом деле это на практике) состоит в том, чтобы иметь видмодели, который имеет вашу коллекцию Games как общедоступную собственность, а также свойство public Games SelectedGame. Затем вы привяжите их к ItemsSource и SelectedItem на ListView, соответственно. Нет ItemClicked обработчик. Но я стесняюсь убеждать вас слишком сильно отказаться от того, что вы делаете, и начать все заново.

+1

Хорошее объяснение. Его так долго, что я использовал «тег» для чего-то. Действительно дни дедушки .... – AVK

+0

Правильно, поэтому я сначала посмотрю в viewmodel. Посмотрите, получится ли это. У вас есть пример кода? Или, может быть, сайт, на котором есть пример? Спасибо за отличное объяснение, это помогает! – Chris

+0

@Chris Вот тот, который выглядит очень «правильно»: https://blogs.msdn.microsoft.com/johnshews_blog/2015/09/09/a-minimal-mvvm-uwp-app/ –

Смежные вопросы