如何访问stackpanel中网格中的文本框

时间:2013-10-22 16:01:53

标签: c# xaml

我有以下代码:

<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网格内的文本框?

1 个答案:

答案 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; 
});