wpf 中的字符串计算器,在 ViewModel 中填充文本框
String calculator in wpf, fill textboxes in ViewModel
所以我目前正在研究我的基于字符串的计算器(学术练习,我还在学习),我在视图的代码隐藏中放置了很多逻辑。现在我的任务是将该逻辑传输到视图模型中。我现在卡住了,我为我拥有的 2 个文本框创建了属性,我想要的只是 digits/operators 我点击添加到文本框字符串,至少现在,我的计算器引擎将做剩下的。但我似乎无法填写文本框。它们应该从“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));
}
}
你的 Getters 看起来像这样
get { return _lowerTextBox = "0"; }
这实际上将分配值“0”,然后 return 刚刚分配的值“0”。
它们应该是这样的
get { return _lowerTextBox; }
如果你想设置一个初始值,这样做
private string _lowerTextBox = "0";
将您的属性 getter 和 setter 更新为此。
private string _lowerTextBox = "0";
public string LowerTextBox
{
get { return _lowerTextBox; }
set
{
if (value == _lowerTextBox) return;
_lowerTextBox = value;
RaisePropertyChanged();
}
}
所以我目前正在研究我的基于字符串的计算器(学术练习,我还在学习),我在视图的代码隐藏中放置了很多逻辑。现在我的任务是将该逻辑传输到视图模型中。我现在卡住了,我为我拥有的 2 个文本框创建了属性,我想要的只是 digits/operators 我点击添加到文本框字符串,至少现在,我的计算器引擎将做剩下的。但我似乎无法填写文本框。它们应该从“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));
}
}
你的 Getters 看起来像这样
get { return _lowerTextBox = "0"; }
这实际上将分配值“0”,然后 return 刚刚分配的值“0”。
它们应该是这样的
get { return _lowerTextBox; }
如果你想设置一个初始值,这样做
private string _lowerTextBox = "0";
将您的属性 getter 和 setter 更新为此。
private string _lowerTextBox = "0";
public string LowerTextBox
{
get { return _lowerTextBox; }
set
{
if (value == _lowerTextBox) return;
_lowerTextBox = value;
RaisePropertyChanged();
}
}