为了账号安全,请及时绑定邮箱和手机立即绑定

文本框自动分配默认值 wpf

文本框自动分配默认值 wpf

C#
浮云间 2022-06-19 16:22:15
我开始通过练习一个简单的加法程序来学习使用 mvvm 的 wpf。我的应用程序运行良好。但是在运行应用程序时,文本框会自动分配默认值 0。在用户提供任何输入之前,我不希望 0 。视图.xaml: <TextBox Height="28" Margin="112,56,46,0"  Text ="{Binding firstargument}"   Name="textBox1" VerticalAlignment="Top" />视图模型.cs  private string _number1;        public string firstargument        {            get { return _number1; }            set            {                this._number1 = value;                this.OnPropertyChanged("firstargument");            }        }我的问题是执行后删除文本框中的值 0 吗?编辑:模型视图.cs class ViewModel : INotifyPropertyChanged    {        public RelayCommand AddNew { get; set; }        private int _number1;        public int firstargument        {            get { return _number1; }            set            {                this._number1 = value;                this.OnPropertyChanged("firstargument");            }        }        private int _number2;        public int secondargument        {            get { return _number2; }            set            {                this._number2 = value;                this.OnPropertyChanged("secondargument");            }        }        private int _number3;        public int _addedargument        {            get { return _number3; }            set            {                _number3 = value;                this.OnPropertyChanged("_addedargument");            }        }    public  ViewModel()    {        AddNew = new RelayCommand(o => AddNumbers());    }    private void AddNumbers()    {//Model instance is created here.        Number p = new Number() { number1 = this._number1, number2 = this._number2 };        var c = p.number1 + p.number2;        _addedargument = c;    }    #region INotifyPropertyChanged Members    public event PropertyChangedEventHandler PropertyChanged;    private void OnPropertyChanged(string propertyName)    {        if (PropertyChanged != null)        {            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));        }    }    #endregion    }
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我将模型的 int 属性包装在一个字符串属性中,因为 TextBox.Text 是一个字符串,其他任何东西都会产生转换错误。


ViewModel 需要自己的字符串,而不是总是将用户的输入转换为 int,因为用户可能会清除该框,或者在键入“-1”的过程中部分输入了一个不是有效数字的值。当您收到转换错误时,WPF 绑定无法更新视图模型,因此您不知道有问题。


    private string firstArgument;


    public string FirstArgument

    {

        get

        {

            return this.firstArgument;

        }


        set

        {

            this.firstArgument= value;


            int tempInt;

            if (int.TryParse(value, out tempInt))

            {

                this.Model.FirstArgument = tempInt;

            }


            this.NotifyPropertyChanged();

        }

    }

以下是我用来验证字符串是否为有效 int 的大部分代码。


    protected void NotifyPropertyChanged([CallerMemberName]string propertyName = null)

    {

        this.CheckForPropertyErrors();


        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }



    public override void CheckForPropertyErrors()

    {

        this.ValidateInt(this.FirstArgument , nameof(this.FirstArgument ));

    }



    protected void ValidateInt32(string value, string fieldName, string displayName = null)

    {

        int temp;

        if (!int.TryParse(value, out temp))

        {

            this.AddError(new ValidationError(fieldName, Constraints.NotInt32, $"{displayName ?? fieldName} must be an integer"));

        }

        else

        {

            this.RemoveError(fieldName, Constraints.NotInt32);

        }

    }


查看完整回答
反对 回复 2022-06-19
?
HUWWW

TA贡献1874条经验 获得超12个赞

int变量的默认值为0。我想,这会帮助你


 private int? _number1;

    public int? firstargument

    {

        get { return _number1; }

        set

        {

            this._number1 = value;

            this.OnPropertyChanged("firstargument");

        }

    }


查看完整回答
反对 回复 2022-06-19
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

原因

您在运行窗口中获得 a 的原因0是您的绑定属性都是int并且0是 a 的默认值int。


0of anint是 XAML 绑定系统的有效值,因此在您键入任何内容之前,您会看到所有TextBoxes 都包含 a 。0


解决方案

您的所有属性都应该是 astring并转换您的实际数字:


private int? _number1;


public string FirstArgument

{

    get => _number1?.ToString();

    set

    {

        if (int.TryParse(value, out var number))

        {

            _number1 = number;

            OnPropertyChanged("FirstArgument");

        }

        else

        {

            _number1 = null;

        }

    }

}

注意:

  1. 因为您可能会得到一个无法转换为的文本int,所以您可以int?在输入错误号时使用它来存储空值。

  2. 将您的数字转换为字符串或从字符串转换,以便它可以正确显示到您的 XAML 绑定系统中。

  3. 该属性应该是字符串,不能是 an,int?因为 XAML 绑定系统不会自动将 a 转换string为 an int,除非您自己转换或编写新的IValueConverter.

更新

要实现该Add命令,只需使用字段而不是属性。


private void AddNumbers()

{

    var a = _number1?.Value ?? 0;

    var b = _number2?.Value ?? 0;

    var c = a + b;

    _addedargument = c;

}

如果要将结果存储到模型中,则存储a, b,c值。


查看完整回答
反对 回复 2022-06-19
  • 3 回答
  • 0 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信