如何在WPF中将TextBox MaxLength设置为4,但仅当该数字为负数时,否则为3?

0kjbasz6  于 2023-02-25  发布在  其他
关注(0)|答案(3)|浏览(204)

我被困在这里了。
我需要的是,我有一个TextBox,它只能有-999999的值,我试过这样设置边界。

<TextBox Height="{Binding ElementName= SomeComboBox, Path=ActualHeight}"
                                     VerticalAlignment="Top"
                                     Tag="int"
                                     HorizontalAlignment="Stretch"
                                     MaxLength="4"
                                     Margin="2, 4, 0, 0"
                                     AutomationProperties.AutomationId="Something_cbSome">
                                <i:Interaction.Behaviors>
                                    <behaviors:TextBoxIntInputBehavior AllowNegative="True" />
                                </i:Interaction.Behaviors>

                                <TextBox.Text>
                                    <Binding Path="Something"
                                             UpdateSourceTrigger="PropertyChanged"
                                             TargetNullValue="">
                                        <Binding.ValidationRules>
                                            <validation:IntRangeRule Min="-999"
                                                                     Max="999" />
                                        </Binding.ValidationRules>
                                    </Binding>
                                </TextBox.Text>
                            </TextBox>

但是很明显,现在有人可以输入4位数,因为MaxLength的值是4。例如1234,它比999高。
此外,这还允许我输入---8--2等内容。
预期可接受值:-999999。不多也不少。我该怎么做?

pw136qt2

pw136qt21#

答案是:
1.您也可以使用滑块(另一个控件,它是坏的)
1.或者,您可以在另一个问题中看到ValidationRule类:ValidationRule for WPF Textbox
再利用它!

g6ll5ycj

g6ll5ycj2#

<TextBox PreviewTextInput="NumericTextHandler" />

   private void NumericTextHandler(object sender, TextCompositionEventArgs e)
        {
            if (e.Text == "-" && ((TextBox)sender).Text.Length == 0)
            {
                e.Handled = false;
            }
            else if (!int.TryParse(e.Text, out _))
            {
                e.Handled = true;
            }
            else
            {
                var newText = ((TextBox)sender).Text + e.Text;
                if (int.TryParse(newText, out var newValue))
                {
                    e.Handled = newValue is < -999 or > 999;
                }
            }
        }

您可以处理Textbox的PreviewTextInput事件,使其仅接受minus和int作为第一个字符,并且仅接受-999到999之间的值。这可能是一个简单的替代方法,可以满足您的需要。

zengzsys

zengzsys3#

我建议将逻辑放入视图模型中:

public class MainViewModel : Binding
    {
        string _MyNumber;
        int _MyValidatedNumber;
        public string MyNumber
        {
            get { return _MyNumber; }
            set
            {
                _MyNumber = value;
                
                if (string.IsNullOrEmpty(_MyNumber))
                {
                    _MyValidatedNumber = 0;
                    _MyNumber = "";
                }
                else if(_MyNumber== "-")
                {
                    _MyValidatedNumber = 0;
                }
                else
                {
                    int temp;
                    if (int.TryParse(_MyNumber, out temp) && (temp <= 999 && temp >= -999))
                    {
                        _MyValidatedNumber = temp;
                    }
                    else
                    {
                        _MyNumber = _MyValidatedNumber.ToString();
                    }
                }
                NotifyPropertyChanged(nameof(MyNumber));
                NotifyPropertyChanged(nameof(MyValidatedNumber));

            }
        }
        public int MyValidatedNumber
        {
            get { return _MyValidatedNumber; }
            set { _MyValidatedNumber = value; NotifyPropertyChanged(nameof(MyValidatedNumber)); }
        }
    }

我在这里使用了两个属性,一个用于原样文本,另一个用于经过验证的值。
XAML代码如下所示:

<Grid>
        <Grid.DataContext>
            <local:MainViewModel/>
        </Grid.DataContext>
        <TextBox 
            Text="{Binding MyNumber,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                                     VerticalAlignment="Top"
                                     HorizontalAlignment="Stretch"
                                     MaxLength="4"
                                     Margin="2, 4, 0, 0"
                                     AutomationProperties.AutomationId="Something_cbSome"
            ToolTip="{Binding MyValidatedNumber}"
            >
            
        </TextBox>
    </Grid>

相关问题