2016-12-31 48 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

是的,這是另一種方式來實現。我很高興聽到我的回答對你有幫助。最好的祝福! –