访问 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)的主要内容,如果未能解决你的问题,请参考以下文章
SQL 语句中搜索参数中的 String TextBox1 文本
怎么将gridview中某列的求和值赋值给控件textbox