рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрдк рдХреЛ MVVM рдлреНрд░реЗрдорд╡рд░реНрдХред рднрд╛рдЧ 1

WPF, Silverlight, Windows Store рдФрд░ Windows Phone рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣рдореЗрд╢рд╛ MVVM рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХрд╛ рдореВрд▓ рджрд░реНрд╢рди рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ (рдореИрдВ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╢рдмреНрдж рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛) рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рдХреА рддрд░реНрдХред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:



  1. рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХрд╛ рдкреГрдердХреНрдХрд░рдг: рдЬреЛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЛ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдЬрдиреЗрд╕ рдПрдкреНрд▓реАрдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдореЙрдбрд▓ рдХреЗ рдЕрдореВрд░реНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  2. рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреА рдЙрдиреНрдирдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╢реЗрд╖ рддрд░реНрдХ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╕реНрддреБрддрд┐ рддрд░реНрдХ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  3. рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рджреГрд╢реНрдп: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдХреЗ рдПрдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  4. рдШрдЯрдХреЛрдВ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЕрд╡рд╕рд░: рдЪреВрдВрдХрд┐ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИ, рдореВрд▓ рдореЙрдбрд▓ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд, рдХрдИ рдореЙрдбрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЖрджрд┐ред




рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдпрд╛ рдерд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦ рдПрдорд╡реАрд╡реАрдПрдо рдкреИрдЯрд░реНрди рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЗрдиреЛрдЯрд┐рдлрд╝рдкреНрд░реЛрдкрд░реЗрдЯреА рдЪреЗрдВрдЬреЗрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЙрдбрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддреЗ рд╣реИрдВ , рдПрдХ рд╕рд░рд▓ ICommand рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг , рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдзрд╛рдЧрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди, рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдХреЗ рд╕реНрддрд░ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪрд░реНрдЪрд╛ рд╕реЗ рдкрд░реЗ рд░рд╣рддреЗ рд╣реИрдВред



рдПрдорд╡реАрд╡реАрдПрдо рд▓рд╛рдЗрдЯ рдФрд░ рдкреНрд░рд┐рдЬреНрдо рдЬреИрд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рджреЗрддреЗ рд╣реБрдП, рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рд░рд▓рддрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмреЛрдЭрд┐рд▓ рд╣реИрдВред



рдпрд╣ рдЖрд▓реЗрдЦ рдЙрди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдорд╡реАрд╡реАрдПрдо рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЙрддрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдорд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕реАрдЦрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рд▓реЗрдЦ рдХреЛ рдЦреБрдж рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рдПрдВрдЧреЗ рдФрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред



рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди "рдХреНрд░реЗрдбрд┐рдЯ рдХреИрд▓рдХреБрд▓реЗрдЯрд░" рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛрдб-рдкреАрдЫреЗ рдХреА рд╢реИрд▓реА рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреАред



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдкреГрд╖реНрда рд╣реЛрддреЗ рд╣реИрдВ: рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХрд╛ рдЙрдкрдпреЛрдЧ рдЛрдг рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреГрд╖реНрда рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб github рдХреЛрдбрдмреЗрд╣рд┐рдиреНрдж рд╢рд╛рдЦрд╛ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред



рдореБрдЦреНрдп рдкреГрд╖реНрда MainPage.xaml рдХреЗ рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛


<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ScrollViewer> <StackPanel> <StackPanel.Resources> <Style TargetType="TextBlock" BasedOn="{StaticResource PhoneTextNormalStyle}"/> </StackPanel.Resources> <TextBlock Text=" " /> <TextBox x:Name="viewAmount" InputScope="Number" /> <TextBlock Text=" "/> <TextBox x:Name="viewPercent" InputScope="Number" /> <TextBlock Text=" " /> <TextBox x:Name="viewTerm" InputScope="Number"/> <Button x:Name="viewCalculate" Content="" Click="CalculateClick" /> <Border x:Name="viewCalculationPanel" BorderBrush="{StaticResource PhoneBorderBrush}" BorderThickness="{StaticResource PhoneBorderThickness}" Margin="{StaticResource PhoneTouchTargetOverhang}" Visibility="Collapsed"> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text=":" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="viewPayment" Style="{StaticResource PhoneTextNormalStyle}"/> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text=":" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="viewTotalPayment" Style="{StaticResource PhoneTextNormalStyle}" /> </StackPanel> <Button Content="" Click="DetailsClick" /> </StackPanel> </Border> </StackPanel> </ScrollViewer> </Grid> <Grid x:Name="viewProgressPanel" Grid.Row="0" Grid.RowSpan="2" Background="{StaticResource OpacityBackgroundBrush}" Visibility="Collapsed"> <ProgressBar Opacity="1" IsIndeterminate="True" /> </Grid>
      
      





рдпрд╣ рдорд╛рд░реНрдХрдЕрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рд╕рднреА рдбреЗрдЯрд╛ рдХреЛрдб-рдкреАрдЫреЗ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



MainPage.xaml.cs рдореБрдЦреНрдп рдкреГрд╖реНрда рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреАрдЫреЗ рдХреЛрдб


 using System; using System.Threading.Tasks; using System.Windows; using Microsoft.Phone.Controls; namespace MVVM_Article { public partial class MainPage : PhoneApplicationPage { public MainPage() { InitializeComponent(); } private void CalculateClick(object sender, RoutedEventArgs e) { decimal amount; decimal percent; int term; if(!decimal.TryParse(viewAmount.Text, out amount)) { viewProgressPanel.Visibility = Visibility.Collapsed; MessageBox.Show("   "); return; } if(!decimal.TryParse(viewPercent.Text, out percent)) { viewProgressPanel.Visibility = Visibility.Collapsed; MessageBox.Show("   "); return; } if(!int.TryParse(viewTerm.Text, out term)) { viewProgressPanel.Visibility = Visibility.Collapsed; MessageBox.Show("    "); return; } Focus(); viewProgressPanel.Visibility = Visibility.Visible; Task.Run(() => { try { var payment = Calculator.CalculatePayment(amount, percent, term); Dispatcher.BeginInvoke(() => { viewCalculationPanel.Visibility = Visibility.Visible; viewPayment.Text = payment.ToString("N2"); viewTotalPayment.Text = (payment * term).ToString("N2"); }); } finally { Dispatcher.BeginInvoke(() => { viewProgressPanel.Visibility = Visibility.Collapsed; }); } }); } private void DetailsClick(object sender, RoutedEventArgs e) { var pageUri = string.Format("/DetailsPage.xaml?amount={0}&percent={1}&term={2}", viewAmount.Text, viewPercent.Text, viewTerm.Text); NavigationService.Navigate(new Uri(pageUri, UriKind.Relative)); } } }
      
      







рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рдЧрдгрдирд╛ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдЪрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдбрд┐рд╕реНрдкреИрдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред



рд╡рд┐рд╕реНрддреГрдд рдХреНрд░реЗрдбрд┐рдЯ рд╡рд┐рд╡рд░рдг рдкреГрд╖реНрда рдкрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреГрд╖реНрда URI рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд▓реЛрди рдбрд┐рдЯреЗрд▓ рдкреЗрдЬ рдХреЛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднреБрдЧрддрд╛рди рд╢реЗрдбреНрдпреВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рднрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ ItemControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣ рд▓реЗрдЦ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред



DetailsPage.xaml.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреБрдЧрддрд╛рди рд╢реЗрдбреНрдпреВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рднрд░рдирд╛


 var style = (Style)Resources["PhoneTextNormalStyle"]; foreach(var record in schedule) { var grid = new Grid(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); var loanElement = new TextBlock { Text = record.Loan.ToString("N2"), Style = style }; Grid.SetColumn(loanElement, 0); var interestElement = new TextBlock { Text = record.Interest.ToString("N2"), Style = style }; Grid.SetColumn(interestElement, 1); var balanceElement = new TextBlock { Text = record.Balance.ToString("N2"), Style = style }; Grid.SetColumn(balanceElement, 2); grid.Children.Add(loanElement); grid.Children.Add(interestElement); grid.Children.Add(balanceElement); viewRecords.Children.Add(grid); }
      
      







рдХреНрд░реЗрдбрд┐рдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рднреБрдЧрддрд╛рди рдЧрдгрдирд╛ рдкрджреНрдзрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЗрд░реА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЗрд╕рдХрд╛ рдХрд╛рдо рдЧрд╣рди рдЧрдгрдирд╛рдУрдВ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рд╕реВрддреНрд░ рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рдЯрдХрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕рднреА рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ Calculator.cs


 internal static class Calculator { public static decimal CalculatePayment(decimal amount, decimal percent, int term) { Task.Delay(1000).Wait(); percent /= 1200; var common = (decimal) Math.Pow((double) (1 + percent), term); var multiplier = percent*common/(common - 1); var payment = amount*multiplier; return payment; } public static List<PaymentsScheduleRecord> GetPaymentsSchedule(decimal amount, decimal percent, int term) { var balance = amount; var interestRate = percent / 1200; var payment = CalculatePayment(amount, percent, term); var schedule = new List<PaymentsScheduleRecord>(); for (var period = 0; period < term; period++) { var interest = Math.Round(balance * interestRate, 2); var loan = payment - interest; balance -= loan; var record = new PaymentsScheduleRecord { Interest = interest, Loan = loan, Balance = balance }; schedule.Add(record); } return schedule; } }
      
      







рдПрдорд╡реАрд╡реАрдПрдо рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди





рдЕрдм рд╣рдо MVVM рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреГрд╢реНрдп рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП INotifyPropertyChanged рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рд╕реНрд░реЛрдд рдХреЛрдб рдЧрд┐рд╡рдм рдкрд░ рднреЛрд▓реЗрд╡рдо рд╢рд╛рдЦрд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ



рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓рддрд╛ рд╣реИред



MainPageViewModel.cs рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛




 public class MainPageViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }
      
      







CallerMemberName рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ , рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЙрд╕ рд╡рд░реНрдЧ рд╕рджрд╕реНрдп рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рд╣реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


 private string _amount; public string Amount { get { return _amount; } set { _amount = value; OnPropertyChanged(); } }
      
      







рдлрд╝реАрд▓реНрдб рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, OnPropertyChanged рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ ICommand рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ; рдпрджрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдХрдорд╛рдВрдб рдХреЗ Execute рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЯреАрдо рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХрдорд╛рдВрдб рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ CanExecute рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА CanExecuteChanged рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рд╣реЛрдЧреА, рдЬреЛ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХрдорд╛рдВрдб рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред



рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрд▓рд┐рдЧреЗрдЯрдХрдореИрдВрдб рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрдорд╛рдВрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕реМрдВрдкреЗрдВрдЧреЗред



DelegateCommand.cs рдлрд╝рд╛рдЗрд▓


 public sealed class DelegateCommand : ICommand { private readonly Action<object> _execute; private readonly Func<object, bool> _canExecute; public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null) { if(execute == null) { throw new ArgumentNullException(); } _execute = execute; _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute == null || _canExecute(parameter); } public void Execute(object parameter) { if(!CanExecute(parameter)) { return; } _execute(parameter); } public event EventHandler CanExecuteChanged; public void RiseCanExecuteChanged() { var handler = CanExecuteChanged; if(handler != null) { handler(this, EventArgs.Empty); } } }
      
      







DelegateCommand рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдореЙрдбрд▓ рдЖрджреЗрд╢ рдХреА рдШреЛрд╖рдгрд╛



 private DelegateCommand _calculateCommand; public DelegateCommand CalculateCommand { get { if(_calculateCommand == null) { _calculateCommand = new DelegateCommand(o => Calculate()); } return _calculateCommand; } }
      
      







рд╡реНрдпреВ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХреЛрдб рдХреЛ MainPage.xaml.cs рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рдкреЗрдЬ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреГрд╖реНрда рдХреА DataContext рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж MainPage.xaml.cs рдлрд╝рд╛рдЗрд▓


 using Microsoft.Phone.Controls; using MVVM_Article.ViewModels; namespace MVVM_Article { public partial class MainPage : PhoneApplicationPage { public MainPage() { InitializeComponent(); DataContext = new MainPageViewModel(); } } }
      
      







рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреГрд╖реНрда рдХреЗ рдХреЛрдб-рдкреАрдЫреЗ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдШрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдзреНрдпрд╛рдпреЛрдВ рдореЗрдВ рдпрд╣ рдкрдВрдХреНрддрд┐ рднреА рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреАред



рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрде = <рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо>} рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкрде рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ <рдкреНрд░реЙрдкрд░реНрдЯреА рдирд╛рдо>} рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, MainPage.xaml рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛


 <TextBlock Text=" " /> <TextBox Text="{Binding Term, Mode=TwoWay}" InputScope="Number"/> <Button Content="" Command="{Binding CalculateCommand}" /> <Border BorderBrush="{StaticResource PhoneBorderBrush}" BorderThickness="{StaticResource PhoneBorderThickness}" Margin="{StaticResource PhoneTouchTargetOverhang}" Visibility="{Binding IsCalculated, Converter={StaticResource BoolToVisibilityConverter}}">
      
      







рдЯреЗрдХреНрд╕реНрдЯ рдореЛрдб рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдкреИрд░рд╛рдореАрдЯрд░ рдореЛрдб = рдЯреВрд╡реЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдЯреНрд░реЛрд▓ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдЗрд╕реЗ рд╡реНрдпреВ рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреГрд╢реНрдп рдореЙрдбрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рджреГрд╢реНрдпрдорд╛рди рдореЙрдбрд▓ рдХреЗ рджреГрд╢реНрдпрддрд╛ рдЧреБрдг рдХреЛ рд╕реАрдзреЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реИрдВред рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореВрд▓реНрдп рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред



рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд┐рдпрди рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдмрдирд╛рдПрдВ, BoolToVisibilityConverter

 public class BoolToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return (value as bool?) == true ? Visibility.Visible : Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
      
      







рдЗрд╕ рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдмреВрд▓рд┐рдпрди рдФрд░ рджреГрд╢реНрдпрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВред



 Visibility="{Binding IsCalculated, Converter={StaticResource BoolToVisibilityConverter}}"
      
      







рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, DeptailsPage рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП MVVM рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдХреЛрдб-рдкреАрдЫреЗ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рдкреГрд╖реНрда рд╕реЗ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрддрд┐ рдореЙрдбрд▓ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдирд┐рд╖реНрдХрд░реНрд╖





рд╡рд░реНрддрдорд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдорд╡реАрд╡реАрдПрдо рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдордиреЗ рдкреЗрдЬ рдХреНрд▓рд╛рд╕ рд╕реЗ рдХреЛрдб рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд MVVM рд▓рд╛рдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред



рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ: MVVM рдореЗрдВ DI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди, MVVM рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред



All Articles