我正在编写一个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);
如您所见,我将其添加到预先存在的堆栈面板中。
答案 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();
现在我可以阅读文本框的值了,我可以继续。
再次感谢您的建议。