ViewModelBase
After
that incorporates
a usercontrol
to create the
application view
Public
Class CalculatorVM
Inherits
ViewModelBase
Private _NumberPress
As ICommand
Private _OperatorPress
As ICommand
Private _Display
As String =
"0.00"
Private _LastOperator
As String
Private _FirstNumber
As Double
Public Property
DoubleZero As String
Public
Property Zero As
Byte
Public
Property One As
Byte
Public
Property Two As
Byte
Public
Property Three As
Byte
Public
Property Four As
Byte
Public
Property Five As
Byte
Public
Property Six As
Byte
Public
Property Seven As
Byte
Public
Property Eight As
Byte
Public
Property Nine As
Byte
Public
Property LastNumber As
Double
Public
Property LastEspecial As
String ' "," or "00"
Public Result
As
Double
Public
Property Display As
String
Get
Return _Display
End Get
Set(ByVal
value As String)
_Display = value
OnPropertyChanged("Display")
End Set
End Property
Public
Property LastOperator As
String
Get
Return _LastOperator
End Get
Set(ByVal
value As String)
_LastOperator = value
OnPropertyChanged("LastOperator")
End Set
End Property
Public
Property FirstNumber As
Double
Get
Return _FirstNumber
End Get
Set(ByVal
value As Double)
_FirstNumber = value
OnPropertyChanged("FirstNumber")
End Set
End Property
Public ReadOnly
Property NumberPress As
ICommand
Get
If _NumberPress
Is Nothing
Then
_NumberPress = New MVVM.RelayCommand(AddressOf
ExecuteNumberPress)
End If
Return _NumberPress
End Get
End Property
Public
ReadOnly Property OperatorPress
As ICommand
Get
If _OperatorPress
Is Nothing
Then
_OperatorPress = New
MVVM.RelayCommand(AddressOf
ExecuteOperatorPress)
End If
Return _OperatorPress
End Get
End
Property
Sub ExecuteNumberPress(ByVal
Param As Object)
Select Case
Param
Case Is
= ","
If Display.Contains(CStr(Param))
= False Then
LastEspecial = ","
Display = Display & LastEspecial
End If
Case
Is = "00"
LastEspecial = "00"
Display = Display & LastEspecial
Case Is
= "CE"
If
String.IsNullOrEmpty(LastOperator)
Then
FirstNumber = 0
Display = 0
Else
LastNumber = 0
End If
Case
Is = "C"
LastNumber = 0
FirstNumber = 0
Display = 0
LastOperator = String.Empty
Case Is
= "â†"
If Display.Length <= 1
OrElse CDbl(Display)
= 0 Then
Display = "0,00"
Else
Display = Left(Display, Display.Length - 1)
End If
Case
Is = "+/-"
If
CDbl(Display) <> 0 Then
Display = CDbl(Display)
* -1
End If
Case Else
If
String.IsNullOrEmpty(LastOperator)
Then
If
CDbl(Display) = 0
OrElse (FirstNumber = 0 And LastNumber =
0) Then
Display = CStr(Param)
Else
Display = Display & CStr(Param)
End
If
_FirstNumber = CDbl(Display)
Else
If LastNumber <> 0
Then
Display = Display & CStr(Param)
Else
Display = CStr(Param)
End
If
LastNumber = CDbl(Display)
End If
End
Select
End Sub
Private Sub
ExecuteOperatorPress(ByVal Param
As Object)
If String.IsNullOrEmpty(LastOperator)
Then
FirstNumber = CDbl(Display)
If CStr(Param)
<> "=" Then
LastOperator = CType(Param,
String)
End If
If LastOperator =
"√" Then
Calculate()
End If
Else
LastNumber = CDbl(Display)
If CStr(Param)
<> "=" Then
LastOperator = CType(Param,
String)
End If
Calculate()
End If
End Sub
Private Sub
Calculate()
Select Case
LastOperator
Case Is
= "%"
Result = FirstNumber * LastNumber / 100
Case Is
= "X"
Result = FirstNumber * LastNumber
Case Is
= "/"
Result = FirstNumber / LastNumber
Case Is
= "+"
Result = FirstNumber + LastNumber
Case Is
= "-"
Result = FirstNumber - LastNumber
Case Is
= "√"
Result = CDbl(Display)
Result = Math.Sqrt(Result)
End Select
Display = Result
LastOperator = String.Empty
FirstNumber = 0
LastNumber = 0
End
Sub
End
Class
And it links
commands
to
the buttons on
the
view like this
<Button
Content="-" Height="30"
Width="30" Command="{Binding
Path=OperatorPress}" CommandParameter="{Binding
Path=Content, RelativeSource={RelativeSource
Self}}"/>
And
<Button
Width="45" Height="45"
Content="CE" Command="{Binding
Path=NumberPress}" CommandParameter="{Binding
Path=Content, RelativeSource={RelativeSource
Self}}"/>
After, we
binds the keypress (this is new in wpf 4.0)
<KeyBinding
Key="NumPad0"
Command="{Binding
Path=NumberPress}"
CommandParameter="0"/>
<KeyBinding
Key="Decimal"
Command="{Binding
Path=NumberPress}"
CommandParameter=","/>
<KeyBinding
Key="Add"
Command="{Binding
Path=OperatorPress}"
CommandParameter="+"/>
Can download
source code from here.