在GridView中访问TextBox文本(C#/ XAML)

时间:2016-12-31 22:34:56

标签: c# windows xaml uwp win-universal-app

所以我有一个自定义的GridView,其中包含一个包含TextBox的数据模板,并由一个名为Player的自定义类列表填充。我需要能够检索Player的实例和TextBox中的文本,并将它们保存到名为Score的新自定义类中。

    <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"/>

我来自基于网络的Java背景,所以这对我来说有点新鲜,但似乎应该是一个相当简单的练习。

最初,我尝试在按钮单击时迭代GridView并抓取每个播放器项目以及TextBox文本并将它们保存到List&lt;&gt;然而,获得TextBox值证明很麻烦。

然后我尝试初始化页面范围List&lt;&gt;每次TextBox值改变时,得分和简单更新,但是,我也无法做到这一点。

任何一种方法的解决方案都可以用于我的目的。任何意见都表示赞赏!

1 个答案:

答案 0 :(得分:0)

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

因此,我们假设您的模型类Player具有以下结构:

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

我将一些数据输入TextBox并单击Save按钮: enter image description here

当我点击“保存”时,它将触发您在“按钮部分”中编写的事件

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

enter image description here

现在,您可以找到具有某些ID属性或您想要的其他方式的玩家。这是实现您想要的最简单的方法。

备注:这可以通过更好的方式使用MVVM模式和其他东西来解决,但正如你提到的那样,你是初学者,所以也许你最好这样解决它,之后再去更先进的技术。希望这对你有所帮助。