WCF RIA рд╕реЗрд╡рд╛рдПрдБред рдкреНрд░рд╛рд░рдВрднред рднрд╛рдЧ 1WCF RIA рд╕реЗрд╡рд╛рдПрдБред рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рднрд╛рдЧ реиWCF RIA рд╕реЗрд╡рд╛рдПрдБред рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯред рднрд╛рдЧ рейWCF RIA рд╕реЗрд╡рд╛рдПрдБред рдкреЗрд╢ рд╣реИ рдореЙрдбрд▓-рд╡реНрдпреВ-рд╡реНрдпреВрдореЙрдбрд▓ (рдПрдорд╡реАрд╡реАрдПрдо) рдкреИрдЯрд░реНрдиред рднрд╛рдЧ рекрдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ WPF рдореЗрдВ рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓-рд╡реНрдпреВ-рд╡реНрдпреВрдореЙрдбрд▓ (MVVM) рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ, рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╕ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ 3 рдкрд╛рдареЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рд╡рд┐рд▓реНрдбреНрд╕ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рддреЛ MVVM рдЙрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ MVC рдФрд░ MVP рдЬреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рдХрд╛рд╕ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ, рдХрдорд╛рдВрдбреНрд╕, рдФрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ WPF рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╡реНрдпреВ рдореЙрдбрд▓ (ViewModel) рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп (рд╡реНрдпреВ) рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣реА рд╣реИ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЧреБрдг рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рджреГрд╢реНрдп рдЖрд╕рд╛рдиреА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдВрдз рд╕рдХреЗ, рдХрдорд╛рдВрдб рдмрдирд╛ рд╕рдХреЗ, рдЬрдмрдХрд┐ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ, рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рддрд░реНрдХ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ, "DataContext" рд╕реЗрдЯ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдмрд╛рдзреНрдп рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рджреГрд╢реНрдп рдореЙрдбрд▓ рд╕реЗ рджреГрд╢реНрдп рдХреА рд▓рдЧрднрдЧ рдкреВрд░реНрдг рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдФрд░ рдбрд┐рдЬрд╛рдЗрдирд░ рджреНрд╡рд╛рд░рд╛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХрд╛ рдПрдХ рд╕реБрдЦрдж рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓рд░ рдЯреЗрдХреНрд╕реНрдЯ (рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ) рдмрдирд╛рдиреЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЖрд╕рд╛рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреВрдЖрдИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдФрд░ рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рда рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣рдорд╛рд░реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред
рдЪрд░рдг 1: рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдмрдирд╛рдирд╛
рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рд╣рдордиреЗ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рд╕рд╛рдереА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рддрд░реНрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП (рдкреЗрдЬ_рдирд╛рдо.рдПрдХреНрд╕рд╛рдорд▓.рдХреИрдВрд╕)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рддрд░реНрдХ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдПрдХ рдордЬрдмреВрдд рд╕реБрд╕рдВрдЧрддрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЦрд░рд╛рдм рдЯреЛрди рд╣реИред рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд╣рдо рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рд╕рднреА рдХреЛрдб рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред "рдЯрд╛рд╕реНрдХ рд╡реНрдпреВрдореЙрдбрд▓" рдирд╛рдордХ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдирдИ рдХрдХреНрд╖рд╛ рдмрдирд╛рдПрдБред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреГрд╢реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рдХрд┐рди рдЧреБрдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣рдо рдЙрд╕ рдлреЙрд░реНрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, DatePickers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реАрд░реНрд╖ рджреЛ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рддрд┐рдерд┐ рдЪрдпрди рдмрдЯрди рдЬреЛрдбрд╝реЗрдВ, рдбреЗрдЯрд╛рдЧреНрд░рд┐рдб рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрддрдВрднреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдФрд░ рдкрдардиреАрдп рд░реВрдк рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ рдХреЙрд▓рдореЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВред
рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рдпреВрдЖрдИ рдХреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЫрд╣ рдЧреБрдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдбреЗрдЯрд╛рдЗрдо рдЧреБрдг, рдХреНрд░рдорд╢рдГ, рддреАрди рдмрдЯрди рдХрдорд╛рдВрдб рдФрд░ рдПрдХ рдХрд╛рд░реНрдп рд╕рдВрдЧреНрд░рд╣ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
public class TasksViewModel { public DateTime LowerSearchDate { get; set; } public DateTime UpperSearchDate { get; set; } public ICommand SearchByDateCommand { get; set; } public ICommand AddTaskCommand { get; set; } public ICommand SaveChangesCommand { get; set; } public IEnumerable<Task> Tasks { get; set; } }
рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП INotifyPropertyChanged рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде UI рдореЗрдВ рдЯреНрд░реИрдХ рдФрд░ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
public class TasksViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged = delegate { }; DateTime _LowerSearchDate; public DateTime LowerSearchDate { get { return _LowerSearchDate; } set { if (value != _LowerSearchDate) { _LowerSearchDate = value; PropertyChanged(this, new PropertyChangedEventArgs("LowerSearchDate")); } } } DateTime _UpperSearchDate; public DateTime UpperSearchDate { get { return _UpperSearchDate; } set { if (value != _UpperSearchDate) { _UpperSearchDate = value; PropertyChanged(this, new PropertyChangedEventArgs("UpperSearchDate ")); } } }
ICommand рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╕рд░рд▓рддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд░рд┐рд▓реЗрдХреЗрдореИрдВрдб рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ DelegateCommand рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рдкреНрд░рд┐рдЬрд╝реНрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
RelayCommand рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "RelayCommand" рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
namespace TaskManager { public class RelayCommand<T> : ICommand { Action<T> _TargetExecuteMethod; Func<T, bool> _TargetCanExecuteMethod; public RelayCommand(Action<T> executeMethod) { _TargetExecuteMethod = executeMethod; } public RelayCommand(Action<T> executeMethod, Func<T,bool> canExecuteMethod) { _TargetExecuteMethod = executeMethod; _TargetCanExecuteMethod = canExecuteMethod; } public void RaiseCanExecuteChanged() { CanExecuteChanged(this, EventArgs.Empty); } #region ICommand Members bool ICommand.CanExecute(object parameter) { if (_TargetCanExecuteMethod != null) { T tparm = (T)parameter; return _TargetCanExecuteMethod(tparm); } if (_TargetExecuteMethod != null) { return true; } return false; } public event EventHandler CanExecuteChanged = delegate { }; void ICommand.Execute(object parameter) { if (_TargetExecuteMethod != null) { _TargetExecuteMethod((T)parameter); } } #endregion } }
рдЪреВрдВрдХрд┐ рджреГрд╢реНрдп рдореЙрдбрд▓ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╡реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдордп рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DomainContext рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ RIA рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ MVVM рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдмрд╕ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ Domainonontext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
TasksDomainContext _Context = new TasksDomainContext(); public TasksViewModel() { SearchByDateCommand = new RelayCommand<object>(OnSearchByDate); AddTaskCommand = new RelayCommand<object>(OnAddTask); SaveChangesCommand = new RelayCommand<object>(OnSaveChanges); Tasks = _Context.Tasks; if (!DesignerProperties.IsInDesignTool) { _Context.Load(_Context.GetTasksQuery()); } }
рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рд╣рдо рдмрд╕ рд╡реНрдпреВ рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ TasksDomainContext рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред рд╡реНрдпреВ рдореЙрдбрд▓ рдХреА рдЯрд╛рд╕реНрдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЯрд╛рд╕реНрдХ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдбреЛрдореЗрди рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреЛ INTifyCollectionChanged рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрджрд┐ "рд▓реЛрдб" рдпрд╛ "SubmitChanges" рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдерд╛рдУрдВред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ "DesignerProperties.IsInDesignTool" рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬреЛ "рдЗрдл" рдмреНрд▓реЙрдХ рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдЬрд╛рдЗрдирд░ рд╕реЗ "рд▓реЛрдб" рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
рдЕрдЧрд▓рд╛ рдХрджрдо рдореЗрдирдкреЗрдЬ .xaml.cs рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╡рд╣ рддрд░реНрдХ рдХрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рд╣реИред рд╣рдо MainPage.xaml.cs рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдпрд╣ рдЕрдВрджрд░ рд╣реА рд░рд╣рддрд╛ рд╣реИ:
namespace TasksManager { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЦреЛрдЬ рд╡рд┐рдзрд┐ рдЕрдм рдЖрд╕реНрдердЧрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рддреАрд╕рд░реЗ рдкрд╛рда рдореЗрдВ рдмрд╛рдд рдХреА рдереАред GetTasksByStartDate рд╡рд┐рдзрд┐ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдбреЛрдореЗрди рд╕реЗрд╡рд╛ рдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдПрдХ рдирдП рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдЕрд▓рдЧ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЬреЛрдбрд╝реЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рджреГрд╢реНрдп рдореЙрдбрд▓ рд╕реЗ рд╕реАрдзреЗ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд MVVM рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдЗрди рдкрд╛рдареЛрдВ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИред рдПрдорд╡реАрд╡реАрдПрдо рдХреА рдПрдХ рдЕрдзрд┐рдХ рд╕рд╣реА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдкреНрд░рд┐рдЬреНрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
private void OnSearchByDate(object param) { _Context.Tasks.Clear(); EntityQuery<Task> query = _Context.GetTasksQuery(); LoadOperation<Task> loadOp = _Context.Load(query.Where(t => t.StartDate >= LowerSearchDate && t.StartDate <= UpperSearchDate)); } private void OnAddTask(object param) {
рдЕрдм рдПрдХ рдкреЙрдкрдЕрдк рдЬреЛрдбрд╝реЗрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ "Add" - "Create Element" - "AddTaskView" рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╛рдо рдХреЗ рд╕рд╛рде "рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдкреЗрдЬ":
<controls:ChildWindow x:Class="TaskManager.AddTaskView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Width="361" Height="287" Title="Add Task" mc:Ignorable="d" xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" xmlns:my="clr-namespace:TaskManager.Web" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> <Grid x:Name="LayoutRoot" Margin="2"> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" /> <Button x:Name="SaveButton" Content="Save" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" Click="OKButton_Click" /> <Grid DataContext="{Binding}" HorizontalAlignment="Left" Margin="12,12,0,0" Name="grid1" VerticalAlignment="Top" Width="315"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="237" /> <ColumnDefinition Width="4*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="100" /> </Grid.RowDefinitions> <sdk:Label Content="Description:" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" /> <TextBox Grid.Column="1" Grid.Row="3" Height="91" HorizontalAlignment="Left" Margin="3,3,0,6" Name="descriptionTextBox" Text="{Binding Path=Description, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}" VerticalAlignment="Center" Width="221" /> <sdk:Label Content="End Date:" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" /> <controls:DatePicker Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="endDateDatePicker" SelectedDate="{Binding Path=EndDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}" VerticalAlignment="Center" Width="120" /> <sdk:Label Content="Start Date:" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" /> <controls:DatePicker Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="startDateDatePicker" SelectedDate="{Binding Path=StartDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}" VerticalAlignment="Center" Width="120" /> <sdk:Label Content="Task Name:" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" /> <TextBox Grid.Column="1" Grid.Row="0" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="taskNameTextBox" Text="{Binding Path=TaskName, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}" VerticalAlignment="Center" Width="221" /> </Grid> </Grid> </controls:ChildWindow>
рд╡рд╣ рд╕рдм рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░ рджреГрд╢реНрдп рдореЙрдбрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред рдЖрдЗрдП рдЕрдкрдиреЗ UI рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдЪрд░рдг 2: рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВ
рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ DomainDataSource рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдХреЗ рджреМрд░рд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рдерд╛ред MVVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ DomainDataSource рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ XAML рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ MVVM рд╡рд┐рднрд╛рдЬрди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред
рдПрдХ DataContext рдЬреЛрдбрд╝реЗрдВред рджреГрд╢реНрдп рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдФрд░ рдмрдирд╛рдП рдЧрдП рдЧреБрдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ:
<UserControl x:Class="TaskManager.MainPage" ...> <UserControl.DataContext> <local:TasksViewModel/> </UserControl.DataContext> <Grid x:Name="LayoutRoot" Background="White"> <sdk:DataGrid ItemsSource="{Binding Tasks}" .../> <Button Command="{Binding SearchByDateCommand}" .../> <Button Command="{Binding AddTaskCommand}" ... /> <Button Command="{Binding SaveChangesCommand}" ... /> <sdk:DatePicker SelectedDate="{Binding LowerSearchDate}" ... /> <sdk:DatePicker SelectedDate="{Binding UpperSearchDate}" ... /> </Grid> </UserControl>
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ
рд╕реНрд░реЛрдд рдХреЛрдб
рдЧреАрдереВрдм рдкрд░