【问题标题】:String calculator in wpf, fill textboxes in ViewModelwpf中的字符串计算器,在ViewModel中填充文本框
【发布时间】:2016-02-04 09:37:08
【问题描述】:

所以我目前正在研究我的基于字符串的计算器(学术练习,我还在学习),并且我在视图的代码背后放置了很多逻辑。现在我的任务是将该逻辑转移到视图模型中。我现在被卡住了,我为我拥有的 2 个文本框创建了属性,我想要的只是将我单击的数字/运算符添加到文本框字符串中,至少现在,我的计算器引擎会做休息。但我似乎无法填写文本框。它们应该以“0”开头,我单击的每个按钮都需要将相应的数字添加到文本框中,但现在它只是替换当前的数字,或者添加它,但只与“0”结合。希望我不要太含糊,也不要太多代码,我还在学习中。 调试的时候看到LowerTextBox的值,在“LowerTextBox = character”之后,其中字符为“8”,例如LowerTextBox得到“08”,这是为什么呢?

class ViewModel : INotifyPropertyChanged
{
    private bool _lastButtonEqual;
    public ICommand StandardButtonCommand { get; set; }
    public ICommand DigitsOnlyCommand { get; set; }

    public ViewModel()
    {
        StandardButtonCommand = new RelayCommand<string>(Button_Click);

        DigitsOnlyCommand = new RelayCommand<string>(OnlyDigitsInTextBox);
    }

    private string _upperTextBox;

    public string UpperTextBox
    {
        get { return _upperTextBox = "0"; }
        set
        {
            if (value == _upperTextBox) return;
            _upperTextBox += value;
            RaisePropertyChanged();
        }
    }

    private string _lowerTextBox;

    public string LowerTextBox
    {
        get { return _lowerTextBox = "0"; }
        set
        {
            if (value == _lowerTextBox) return;
            _lowerTextBox += value;
            RaisePropertyChanged();
        }
    }

    private void OnlyDigitsInTextBox(string character)
    {
        if (UpperTextBox.EndsWith("+") || UpperTextBox.EndsWith("-") || UpperTextBox.EndsWith("/") ||
            UpperTextBox.EndsWith("*") || LowerTextBox == "0" || _lastButtonEqual)
        {
            LowerTextBox = character;
        }
        else
        {
            LowerTextBox += character;
        }

        if (UpperTextBox == "0")
        {
            UpperTextBox = character;
        }
        else
        {
            UpperTextBox = UpperTextBox + character;
        }

        _lastButtonEqual = false;
    }

    private void Button_Click(string digit)
    {
        OnlyDigitsInTextBox(digit);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

【问题讨论】:

  • LowerTextBox 的设置器中,附加您正在设置的值(_lowerTextBox += value)。因此,该值被追加而不是被替换。
  • 我在某个时候改变了它,因为我认为它可能有意义。我像你说的那样把它改回来了,但是现在当我点击一个按钮时没有任何反应,LowerTextBox,尽管有“LowerTextBox = character;”这一行保持“0”作为值。

标签: c# wpf mvvm calculator


【解决方案1】:

将您的属性 getter 和 setter 更新为此。

private string _lowerTextBox = "0";

    public string LowerTextBox
    {
        get { return _lowerTextBox; }
        set
        {
            if (value == _lowerTextBox) return;
            _lowerTextBox = value;
            RaisePropertyChanged();
        }
    }

【讨论】:

  • 非常感谢,这行得通,而且也很有意义,应该已经看到了。谢谢!
【解决方案2】:

你的 Getter 看起来像这样

get { return _lowerTextBox = "0"; }

这实际上将分配值“0”,然后返回刚刚分配的值“0”。

它们应该是这样的

get { return _lowerTextBox; }

如果你想设置一个初始值,这样做

private string _lowerTextBox = "0";

【讨论】:

  • 非常感谢,它现在可以工作了,应该看到这更有意义了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2013-09-20
  • 2016-11-21
  • 2011-09-13
相关资源
最近更新 更多