C# - 在循环中启用多个文本框

时间:2016-01-09 11:59:49

标签: c# wpf loops textbox

我正在编写一个WPF程序,它涉及某人输入一个数字,并启用相应数量的文本框。目前我有一个系统可以检查每个文本框,例如

private void navnumbox_TextChanged(object sender, TextChangedEventArgs e)
{
    try
    {
        if (Int32.Parse(navnumbox.Text) > 0)
        {
            One.IsEnabled = true;
        }

        if (Int32.Parse(navnumbox.Text) > 1)
        {
            Two.IsEnabled = true;
        }
    }
}

我想把它放到一个循环中,我认为我可能需要将One和Two存储在一个数组中,但我已经尝试但我不知道如何访问它们

2 个答案:

答案 0 :(得分:2)

也许你可以尝试这样的事情(我无法测试对不起)。

private void navnumbox_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBoxesMap = new Dictionary<int,TextBox>()
    {
        {1, One},
        {2, Two}
        // etc
    };

    try
    {
        int number = int.Parse(navnumbox.Text)
        foreach(var item in textBoxesMap)
        {
            if(item.Key <= number)
            {
                item.Value.IsEnabled = true;
            }
        }
    }
}

显然,您可以将地图放在其他地方。另一种(也是更好的)方法是使用XAML - 这个问题还有另一个答案,说明了如何做到这一点。

答案 1 :(得分:2)

我认为更好的方法是通过ElementBinding将TextBoxes One和Two的Converter for Visibility属性用于navnumbox Path = Text。

我是你的情况,你需要单独的TextBox.Enable转换器用于TextBoxes One和Two。

这里是窗口的XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication2="clr-namespace:WpfApplication2"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Window.Resources>
        <wpfApplication2:MyConverter x:Key="MyConverter"></wpfApplication2:MyConverter>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <TextBox x:Name="MyText"></TextBox>
            <TextBox IsEnabled="{Binding ElementName=MyText, Path=Text, Converter={StaticResource MyConverter}}"></TextBox>
        </StackPanel>
    </Grid>
</Window>

这里实现了针对TexBox的转换器“One”

public class MyConverter
        : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string myValue = value as string;
            int result = 0;
            if (myValue != null)
            {
                int.TryParse(myValue,out result);
            }

            return result > 0;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // not relevant for your application
            throw new NotImplementedException();
        }
    }