2016-02-04 4 views
1

Так что я сейчас работаю над своим строковым калькулятором (академическое упражнение, я все еще изучаю), и я вложил много логики в код «За собой». Теперь моя задача - перенести эту логику в viewmodel. Я застрял прямо сейчас, я создал Свойства для 2 текстовых полей, которые у меня есть, и все, что я хочу, это для цифр/операторов, на которые я нажимаю, чтобы быть добавленными в строку текстового поля, по крайней мере на данный момент, мой калькулятор Engine сделает отдых. Но я не могу заполнить текстовые поля. Они должны начинаться с «0», и каждая кнопка, которую я нажимаю, должна добавить соответствующую цифру в текстовые поля, но сейчас она просто заменяет текущую или добавляет ее, но только в сочетании с «0». Надеюсь, я не слишком расплывчатый, и это не слишком много кода, я все еще учусь. При отладке я вижу, что значение LowerTextBox, после «LowerTextBox = character», где символ «8», например, LowerTextBox получает «08», почему?Строковый калькулятор в wpf, заполнить текстовые поля в ViewModel

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)); 
     } 
    } 
+0

В настройщике вашего «LowerTextBox» вы добавляете значение, которое вы устанавливаете ('_lowerTextBox + = значение'). Следовательно, значение добавляется вместо замены. –

+0

Я изменил это в какой-то момент, потому что думал, что это может иметь смысл. Я изменил его, как вы сказали, но теперь ничего не происходит, когда я нажимаю кнопку «LowerTextBox», несмотря на строку «LowerTextBox = character»; сохраняет значение «0» в качестве значения. – tweedledum11

ответ

1

Update ваши свойства получения и установки к этому.

private string _lowerTextBox = "0"; 

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

Большое спасибо, что работает, и это тоже имеет большой смысл, должно было это увидеть. Спасибо! – tweedledum11

+0

Добро пожаловать :) – Sivasubramanian

1

Ваш Геттеры выглядеть следующим образом

get { return _lowerTextBox = "0"; } 

Это существенно присвоить значение «0», а затем возвращать только присвоенное значение «0».

Они должны выглядеть так

get { return _lowerTextBox; } 

Если вы хотите установить начальное значение, сделайте это как этот

private string _lowerTextBox = "0"; 
+0

Большое спасибо, сейчас он работает, должен был видеть, что это имеет гораздо больший смысл. – tweedledum11

Смежные вопросы