2016-12-31 72 views
1

因此,我有一个自定义的GridView,其中包含一个TextBox并由一个名为Player的自定义类的列表填充。我需要能够检索播放器的实例和TextBox中的文本,并将它们保存到名为Score的新自定义类中。在GridView中访问TextBox文本(C#/ XAML)

<GridView x:Name="gridScore" ItemsSource="{x:Bind PlayerList}" IsItemClickEnabled="True"> 
     <GridView.ItemTemplate> 
      <DataTemplate x:DataType="data:Player"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBox x:Name="txtbxGridScore" TextChanged="txtbxGridScoreChangedEventHandler" /> 
        <Image Source="{x:Bind ProfilePicture}"/> 
        <StackPanel VerticalAlignment="Center"> 
         <TextBlock Text="{x:Bind FullName}" /> 
         <TextBlock Text="{x:Bind Alias}" /> 
        </StackPanel> 
       </StackPanel> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
    <Button x:Name="buttonSave" Content="Save Scores" Style="{StaticResource BarButtonStyle}" Click="buttonSave_Click"/> 

我来自一个基于Web的Java的背景,所以这是一个有点新的给我,但现在看来似乎应该是一个相当简单的练习。

最初,我尝试通过按钮单击并抓取每个播放器项目以及TextBox文本并将它们保存到Score的列表<>,然而,获取TextBox值证明是麻烦的,通过GridView迭代。

然后我尝试初始化Score的一个页面范围列表<>,并在每次更改TextBox值时更新它,但是我无法做到这一点。

任何一种方法的解决方案都可以正常工作。任何输入是赞赏!

+0

你可以说为什么你想要TextBox的价值?要清楚你想在哪种情况下获得它的价值。 –

+0

当然!值是玩家得分。因此,该应用程序显示了所有当前玩家的列表,然后用户输入每个玩家获得的分数。 – Kathoolu

+0

所以你想通过上面的文本框输入玩家的分数? –

回答

0

如果我正确地理解了你,这是解决你的问题的方法之一。

因此,让我们假设你的模型类的球员有这样的结构:

public class Player { 

    public int PlayerID { get; set; } 
    public string ProfilePicture { get; set; } 
    public string FullName { get; set; } 
    public string Alias { get; set; } 

    public float PlayerScore { get; set; } // To store textbox value 
} 

所以,你可以通过使用双向结合解决这个问题。

XAML部分将是这个样子:

<GridView x:Name="gridScore" 
        ItemsSource="{x:Bind PlayerList}" 
        IsItemClickEnabled="True"> 

      <GridView.ItemTemplate> 
       <DataTemplate x:DataType="data:Player"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBox x:Name="txtbxGridScore" 
           Text="{x:Bind PlayerScore, Mode=TwoWay}" /> 

         <Image Source="{x:Bind ProfilePicture}" /> 
         <StackPanel VerticalAlignment="Center"> 
          <TextBlock Text="{x:Bind FullName}" /> 
          <TextBlock Text="{x:Bind Alias}" /> 
         </StackPanel> 
        </StackPanel> 
       </DataTemplate> 
      </GridView.ItemTemplate> 
     </GridView> 
     <Button x:Name="buttonSave" 
       Content="Save Scores" 
       Click="buttonSave_Click" /> 

我有一些像这样的虚拟数据初始化您PlayerList:

PlayerList = new ObservableCollection<Player>() { 

      new Player() { 
       FullName = "Player A", Alias = "AAA" 
      }, 

      new Player() { 
       FullName = "Player B", Alias = "BBB" 
      } 
}; 

正如你可以在XAML看到我绑定的文本框Player类型为PlayerScore属性。

当我运行这个程序,我得到的画面是这样的:

enter image description here

我会输入一些数据到文本框,然后点击保存按钮: enter image description here

当我点击保存它会触发你在按钮部分写的事件

在那种情况下,我有一个foreach循环遍历列表和一个断点,正如你在第一次看到的项目“玩家A”的PlayerScore值是10:

enter image description here

现在你可以用一些ID财产或者您想一些其他的方式找到你的球员。这是完成你想要的最简单的方法。

备注:这可能在使用MVVM模式和其他的东西更好的办法来解决,但正如你所说,你是初学者,所以也许这是更好地为你解决它像这样,之后去了更先进的技术。希望这对你有帮助。

+0

感谢您的帮助! 虽然这个特定的解决方案假定TextBox的值进入Player类的属性,而不是完全独立的分数类,但我能够使用小的(尽管有点麻烦)解决方法来处理它。我创建了一个具有Player和Score属性的新临时类,然后将我的GridView绑定到该类的列表。然后,当节省时间时,我可以访问属于对方的玩家和分数,我可以随心所欲地处理它们。 对我来说够好!再次感谢! – Kathoolu

+0

是的,这是另一种方式来实现。我很高兴听到我的回答对你有帮助。最好的祝福! –