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

Posted

技术标签:

【中文标题】访问 GridView 中的 TextBox 文本 (C# / XAML)【英文标题】:Accessing TextBox Text Inside GridView (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值的原因是什么?要明确在什么场景下你想得到它的价值。 当然!该值是玩家获得的分数。因此,该应用会显示所有当前玩家的列表,然后用户输入每个玩家获得的分数。 那么你想通过上面的文本框为玩家输入分数吗? 你也可以编辑你的帖子向我们展示你正在使用的模型类播放器。 【参考方案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,我可以随意使用它们。对我来说已经足够好了!再次感谢! 是的,这是实现这一目标的另一种方式。很高兴听到我的回答对您有所帮助。最好的问候!

以上是关于访问 GridView 中的 TextBox 文本 (C# / XAML)的主要内容,如果未能解决你的问题,请参考以下文章

GridView 中的 textbox 如何手写 输入值

SQL 语句中搜索参数中的 String TextBox1 文本

JS如何给gridview中的某一个textBox赋值

怎么将gridview中某列的求和值赋值给控件textbox

Asp.net C# 使用 Javascript 将数据从 gridview 显示到 TextBox

怎样设置才能使得textbox中输入的只是0-100之间的数字