MVVM рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ

рдЬреЛрд╢ рд╕реНрдорд┐рде WPF рдПрдкреНрд╕ рд╡рд┐рде рдж рдореЙрдбрд▓-рд╡реНрдпреВ-рд╡реНрдпреВрдореЙрдбрд▓ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рдкреНрд░рд╕рд┐рджреНрдз рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдмрд╛рд░ , рдореИрдВ MVVM рджрд░реНрд╢рди рд╕реЗ рдмрд╣реБрдд рдкреНрд░реЗрд░рд┐рдд рдерд╛ рдФрд░ рд╕рднреА рднрд╡рд┐рд╖реНрдп рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ "рдПрдорд╡реАрд╡реАрдПрдо" рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдФрд░ рдХрдорд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ (рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░рд╛рдп рдореЗрдВ)ред рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ UserControl рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдореБрдЭреЗ рд╡реЗрдм рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЬрдм рдореИрдВрдиреЗ ViewModel рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдмрд╛рдВрдзрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:
'рдкрд╛рд╕рд╡рд░реНрдб' рдЯрд╛рдЗрдк 'рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕' рдХреА рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░ 'рдмрд╛рдЗрдВрдбрд┐рдВрдЧ' рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ 'рдмрд╛рдЗрдВрдбрд┐рдВрдЧ' рдХреЗрд╡рд▓ рдПрдХ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдСрдкрд░реЗрд╢рди рдХреЗ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

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

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБ:

<Label Content="Login:" HorizontalAlignment="Right"/> <TextBox Grid.Column="1" Margin="3" Text="{Binding UserName, Mode=TwoWay}"/> <Label Grid.Row="1" Content="Password:" HorizontalAlignment="Right"/> <PasswordBox Grid.Row="1" Grid.Column="1" Margin="3" Name="pwdBox"/> <Button Grid.Row="2" Grid.ColumnSpan="2" Width="70" Height="25" HorizontalAlignment="Right" Content="Login" Command="{Binding LoginCommand}"/> 

рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЪрд╛рд╣рд┐рдП:

  public interface IPasswordSupplier { string GetPassword(); } 


рд╣рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

  public partial class LoginControl : UserControl, IPasswordSupplier { public LoginControl() { InitializeComponent(); } public string GetPassword() { return pwdBox.Password; } } 


рд╡рд┐рдзрд┐ рдХреА рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ LoginControl рдХреЛ рдХреЛрдб рдореЗрдВ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ IPasswordSupplier рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред IoC рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрджрд╛рд╣рд░рдг App.xaml.cs рдореЗрдВ рджрд░реНрдЬ рдХрд░реЗрдВ:

  protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); IUnityContainer container = new UnityContainer(); LoginControl loginControl = new LoginControl(); container.RegisterInstance<IPasswordSupplier>(loginControl); LoginViewModel loginViewModel = new LoginViewModel(container); loginControl.DataContext = loginViewModel; MainWindow mainWindow = new MainWindow(loginControl); MainWindowViewModel windowViewModel = new MainWindowViewModel(loginViewModel); mainWindow.DataContext = windowViewModel; mainWindow.Show(); } 


рдЕрдм рдирд┐рдпрдВрддреНрд░рдг рдХреЗ ViewModel рдореЗрдВ рд╣рдо рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рдХреА рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
 public string Password { get { IPasswordSupplier passwordSupplier = container.Resolve<IPasswordSupplier>(); return passwordSupplier.GetPassword(); } } 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ ViewModel рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЧреБрдг рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ MVVM рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ рдЕрдм рд╣рдорд╛рд░рд╛ ViewModel рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ View рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рддрд░реАрдХрд╛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In169231/


All Articles