2017-01-17 16 views
0

ListView Itemにタグを追加しようとしています(ボタンにタグを追加するなど)。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.ClickedItemListViewItemになりません。 List<Games>ListView.ItemsSourceにあなたが提供した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に反映されないため、Listは実際にはOnLoadedメソッドのローカルになっていなければなりません。または、より良い方法として、そのタイプをObservableCollection<Games>に変更します。それはList<T>のドロップイン置換になります。

私が言ったように、残念なことに、非常に悪いチュートリアルを見つけたと思います。

これを行う「正しい」方法(実際には実際には)Gamesコレクションを公開プロパティとして持つビューモデルと、public Games SelectedGameプロパティも持っています。次に、それぞれListViewItemsSourceSelectedItemにバインドします。 No ItemClickedハンドラ。しかし、私はあなたがやっていることを落としてやり直すことを強く強く求めています。

+1

良い説明。私は何かのために 'タグ'を使っていたので、ずっと長くなっています。本当におばあちゃんの日.... – AVK

+0

右、私は最初にビューモデルを調べます。それがうまくいくかどうかを見てください。サンプルコードがありますか?または、例があるウェブサイトですか?素晴らしい説明もありがとう、それは多くの助けになります! – Chris

+0

@Chris非常に「正しい」ものです:https://blogs.msdn.microsoft.com/johnshews_blog/2015/09/09/a-minimal-mvvm-uwp-app/ –

関連する問題