びおりんのブログ

きままにアプリのできるまでを公開していきます

WPFのMVVMで電卓づくり(14)

百分率で計算するパーセントボタン「%±」を実装します

構想

MainViewにてエラー時無効となるパーセントボタン「%±」を実装します
MainModelにてパーセントボタンに対応した内部データの更新処理を実装します

実装

構想に沿って各MVVMクラスに追記していきます

MainView

パーセントボタン「%±」を実装します

     <!--パーセントボタン-->
        <Button Grid.Row="1" Grid.Column="4" Content="%±" CommandParameter="Percent"/>

尚、前回までの実装で既にボタンのStyleにて
IsEnabledにエラー時falseとなるプロパティを紐づけしてあります

MainModel

「%±」ボタンクリックでMainViewModel.PushCommand経由で
呼び出されるMainModel.SetOperation()にて
switch-case文に「%±」ボタン用の処理を追記します

                   case OperationKind.Percent:
                        if (this.IsAdditional)
                        {
                            if (double.TryParse(this.OriginalText, out double originalValue)
                             && double.TryParse(this.AffectText, out double affectValue))
                            {
                                switch (this.Operation) 
                                {
                                    case OperationKind.Plus:
                                    case OperationKind.Minus:
                                        affectValue = originalValue * affectValue / 100D;
                                        break;
                                    case OperationKind.Multiply:
                                    case OperationKind.Divide:
                                        affectValue /= 100D;
                                        break;
                                    default:
                                        return;
                                }
                                this.AffectText = affectValue.ToString();
                                this.DisplayText = this.AffectText;
                                Calculate(this.Operation);
                                SetOperationText(ope);
                            }
                        }
                        break;

動作確認

起動後「2」「0」「0」「+」「5」「%±」とクリックした際の画面表示
f:id:kazoojapan1985:20200506220850p:plain 起動後「2」「0」「0」「×」「5」「%±」とクリックした際の画面表示
f:id:kazoojapan1985:20200506220853p:plain