2

次のコードがあります。

<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 のグリッド内のテキスト ボックスにアクセスするにはどうすればよいですか?

4

1 に答える 1

1

この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; }

標準DelegateCommand実装の使用:

ClearAllCommand = new DelegateCommand(arg => {
    MinValue = null;
    MaxValue = null; 
});
于 2013-10-22T16:12:00.913 に答える