【问题标题】:Accessing TextBox Text Inside GridView (C# / XAML)访问 GridView 中的 TextBox 文本 (C# / XAML)
【发布时间】:2017-05-15 16:39:07
【问题描述】:

所以我有一个自定义的 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"/>

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

最初,我尝试在单击按钮时遍历 GridView,并抓取每个 Player 项目以及 TextBox 文本并将它们保存到 Score 的 List 中,但是,获取 TextBox 值被证明很麻烦。

然后我尝试初始化 Score 的页面范围 List 并在每次更改 TextBox 值时简单地更新它,但是我也无法完成这项工作。

任何一种方法的解决方案都适合我的目的。任何意见表示赞赏!

【问题讨论】:

  • 你能说你想要TextBox值的原因是什么?要明确在什么场景下你想得到它的价值。
  • 当然!该值是玩家获得的分数。因此,该应用会显示所有当前玩家的列表,然后用户输入每个玩家获得的分数。
  • 那么你想通过上面的文本框为玩家输入分数吗?
  • 你也可以编辑你的帖子向我们展示你正在使用的模型类播放器。

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


【解决方案1】:

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

所以让我们假设你的模型类 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 属性绑定。

当我运行这个应用程序时,我会看到这样的屏幕:

我会在 TextBox 中输入一些数据,然后点击保存按钮:

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

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

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

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

【讨论】:

  • 感谢您的帮助!虽然这个特定的解决方案假设 TextBox 的值进入 Player 类的属性,而不是完全独立的 Score 类,但我能够通过一个小(尽管有点混乱)的解决方法让它工作。我创建了一个具有 Player 和 Score 属性的新 Temporary 类,然后将我的 GridView 绑定到此类的列表。然后,当需要保存时,我可以访问属于彼此的 Player 和 Score,我可以随意使用它们。对我来说已经足够好了!再次感谢!
  • 是的,这是实现这一目标的另一种方式。很高兴听到我的回答对您有所帮助。最好的问候!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多