我有以下代码:
<StackPanel x:Name="ContentStackPanel">
<Grid>
<TextBlock Text="Min Value" />
<TextBox Text="{Binding MinValue}" />
</Grid>
<Grid>
<TextBlock Text="Max Value" />
<TextBox Text="{Binding MinValue}" />
</Grid>
</StackPanel>
我想添加一个按钮,以便我可以清除两个TextBox中的文本。此代码不起作用
private void ClearAllClick(object sender, RoutedEventArgs e)
{
foreach (TextBox tb in ContentStack.Children)
{
tb.Text = String.Empty;
}
}
如何访问ContentStackPanel网格内的文本框?
答案 0 :(得分:0)
Children
属性只为您提供直接的孩子,而不是所有后代。您可以编写一个帮助方法来遍历树:
private void ClearAllClick(object sender, RoutedEventArgs e)
{
ClearTextChildren(ContentStackPanel);
}
private void ClearTextChildren((Panel container)
{
foreach (var element in container.Children)
{
if (element is TextBox)
((TextBox)element).Text = String.Empty;
else if (element is Panel)
ClearChildren((Panel)element);
}
}
另一种方法(可能更好,因为在代码中遍历UI树很脆弱)就是在按钮上使用Command
实现,而不是单击处理程序。这将允许您清除视图模型属性而不是文本框本身。
<Button x:Name="ClearAll" Command="{Binding ClearAllCommand}" />
“ClearAllCommand”应与“MinValue”和“MaxValue”位于同一位置:
public ICommand ClearAllCommand { get; private set; }
使用standard DelegateCommand
implementation:
ClearAllCommand = new DelegateCommand(arg => {
MinValue = null;
MaxValue = null;
});