WPF运行时在网格中的文本框文本始终为空

时间:2014-12-08 21:16:18

标签: c# wpf xaml

我正在编写一个C#WPF桌面应用程序。 对于一个窗口,我从数据库获取XAML数据,该数据库是带有标签和文本框的序列化网格。 这种反序列化效果很好。我看到了标签和文本框。

在文本框中输入文字后,我按下一个按钮。 我现在需要知道我输入了什么。所以我传递了我的网格(有一个名字),然后我遍历网格的子节点。我得到了文本框但是它们的文本是空的或者具有原始XAML的值。 我保留的任何内容都没有保留。 文本框没有绑定。

<Grid Name="GridQuestions">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
    </Grid.RowDefinitions>

    <Label Content="foo: " Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right"/>
    <TextBox Tag="CliFoo" Text="Test" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" Height="23" Margin="0" VerticalAlignment="Top" Width="360" />

    <Label Content="Bar: " Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right"/>
    <TextBox Tag="CliBar" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" Height="23" Margin="0" VerticalAlignment="Top" Width="360" />

    <Label Content="BlaBla: " Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right"/>
    <TextBox Tag="CliBlaBla" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" Height="23" Margin="0" VerticalAlignment="Top" Width="360" />

</Grid>

在按钮中单击我执行:

foreach (var textbox in gridQuestions.Children.OfType<TextBox>().Where(textbox => !string.IsNullOrEmpty(textbox.Tag.ToString())))
{
  DoSomething(textbox.Text);
}

对于3个文本框,textbox.Text始终为空,除了第一个是&#39; test&#39;。 但是我没有得到我输入的值。

我错过了什么?

编辑:

我使用这篇文章中解释的技术:http://www.codeproject.com/Tips/82990/XAML-Serialization来(de-)从数据库中序列化XAML。

这是我使用的实际代码:

var grid = (Grid)XamlReader.Parse(this.db.GridXaml);
this.QuestionsStackPanel.Children.Clear();
this.QuestionsStackPanel.Children.Add(grid);

如您所见,我将其添加到预先存在的堆栈面板中。

2 个答案:

答案 0 :(得分:0)

首先,您使用Name在XAML中声明“GridQuestions”,而不是xName。您不能仅在后面的代码中使用使用Name声明的控件。

其次,我不建议像TextBox那样填充。更好地使用绑定,或者如果您有动态添加的文本框,请考虑使用DataTemplates,以及某种ListView或GridView。

了解MVVM模式here

答案 1 :(得分:0)

我找到了解决方案。它是评论和更多研究的组合。 首先,我在XAML中将名称更改为x:名称。 接下来,我在帖子中添加了网格。克莱门斯使用gridQuestions = (Grid)XamlReader.Parse(...);的建议对我不起作用。

最后也是最重要的部分就像Clemens建议的那样,我没有按照正确的实例进行操作。

我现在从stackpanel获取第一个网格,而不是使用网格名称:var grid = this.QuestionsStackPanel.Children.OfType<Grid>().FirstOrDefault();

现在我可以阅读文本框的值了,我可以继续。

再次感谢您的建议。