2. «Художественная»
Литература
«Совершенный код» Стив Макконнелл
«Deadline. Роман об управлении проектами» Том ДеМарко
C#
Джеффри Рихтер «CLR via C#»
«Программирование на платформе Microsoft.NET Framework 4.5 на языке C#»
Эндрю Троелсен «Язык программирования C# 5.0 и платформа .NET 4.5»
WPF
Адам Натан «WPF 4. Unleashed» (Подробное руководство)
Мэтью Макдональд
4. С#
public class Person: BaseClass, IClonable, ICommand
{
private static const cUni = «BFU»;
!
/
/свойство
private string mName;
public string Name
{
get { return mName; }
set { mName = value; }
}
}
/
/свойство
public string Surname { get; set;}
5. Наследование
!
public abstract class Animal
{
public virtual int LegsCount()
{
return 4;
}
public class Human: Animal
{
public override int LegsCount()
{
return 2;
}
!
!
public override string Say()
{
return «Hello»;
}
public abstract string Say();
}
}
Human john = new Human();
string firstWord = john.Say();
Animal someone = john;
int legsCount = john.LegsCount();
6. Интерфейсы
public interface ICommand
{
string CommandName
{
get;
}
public class MyCommand: ICommand
{
public string CommandName
{
get { return «MyFirstCommand»; }
}
!
public void Execute()
{
Console.Writeln(«HelloWorld»):
}
void Execute;
}
}
List<ICommand> commands = OurSmartClass.GetCommands();
foreach (var command in commands)
{
command.Execute();
}
7. События и делегаты
public class SmartClass
{
public delegate void Action (string option);
!
public event Action SomethingHappens;
!
private void SmartOperation()
{
if ( SomethingHappens!=null ) /
/есть ли подписчики
SomethingHappens(«error»);
}
}
SmartClass ourClass = new SmartClass();
ourClass.SomethingHappens += ReactOnEvent;
private void ReactOnEvent (string option) {}
10. MVVM
msdn о MVVM Pattern:
http:/
/bit.ly/1k2Q6sY
Events
Прямая связь только так:
View
ViewModel
Model
Чтобы не было соблазна,
создавайте три разных
проекта (Project) в одном
Solution:
!
OurProgram.View
OurProgram.ViewModel
OurProgram.Model
11. Data Binding - привязка данных
public class MainViewModel : BaseViewModel
!
{
private string mFavoriteColor;
!
public string FavoriteColor
{
get { return mFavoriteColor; }
set
{
if (value != mFavoriteColor)
{
mFavoriteColor = value;
OnPropertyChanged("FavoriteColor");
}
}
Чтобы View узнало об
}
изменениях в ViewModel
}
12. INotifyPropertyChanged
public class BaseViewModel : INotifyPropertyChanged
!
{
#region INotifyPropertyChanged members
!
public event PropertyChangedEventHandler PropertyChanged;
!
protected virtual void OnPropertyChanged (string propertyName)
!
{
!
if (PropertyChanged != null)
!
{
!
var e = new PropertyChangedEventArgs (propertyName);
!
PropertyChanged (this, e);
!
}
!
}
!
#endregion
!
}
13. App.xaml.cs
DataContext
public partial class App : Application
!
{
protected override void OnStartup(StartupEventArgs e)
{
!
base.OnStartup(e);
!
MainWindow window = new MainWindow();
!
var viewModel = new MainViewModel();
!
window.DataContext = viewModel;
!
window.Show();
!
}
!
}
14. ICommand
public class MyCommand : ICommand
!
{
#region ICommand members
!
public bool CanExecute (object parameter)
{
… / если команда используется для Button, то при false Button будет не активна
/
!
}
!
public void Execute (object parameter)
!
{
…
!
}
!
public event EventHandler CanExecuteChanged
{
!
add { CommandManager.RequerySuggested += value; }
!
remove { CommandManager.RequerySuggessted -= value; }
!
}
!
#endregion
!
}
15. Использование RelayCommand
public class CustomerViewModel: BaseViewModel
!
{
private ICommand mSaveCommand;
!
public ICommand SaveCommand
{
get
{
if (mSaveCommand == null)
{
mSaveCommand = new RelayCommand(
param => this.Save(),
param => this.CanSave());
}
return mSaveCommand;
}
}
!
!
}
private void Save() {}
private bool CanSave() {}
16. Data Validation - IDataErrorInfo
public class CustomerViewModel: BaseViewModel, IDataErrorInfo
!
{
public string IDataErrorInfo.Error
{
get { return (_customer as IDataErrorInfo).Error; }
}
!
!
public string IDataErrorInfo.this[string propertyName]
{
get {
string error = null;
if (propertyName == "CustomerType")
error = this.ValidateCustomerType();
else
error = (_customer as IDataErrorInfo)[propertyName];
CommandManager.InvalidateRequerySuggested();
return error;
}
!
}
}
private string ValidateCustomerType()
{
if (this.CustomerType == Strings.CustomerViewModel_CustomerTypeOption_Company ||
this.CustomerType == Strings.CustomerViewModel_CustomerTypeOption_Person)
return null;
return Strings.CustomerViewModel_Error_MissingCustomerType;
}